{
  "openapi": "3.1.0",
  "info": {
    "title": "Cloud Phone Local API",
    "description": "Manage cloud phone instances through the MoreLogin Local API.\n\n**Base URL**: `http://127.0.0.1:40000`\n\nThe Local API runs on your machine alongside the MoreLogin desktop app.\nAll requests must originate from the same machine.\n",
    "version": "2026-09-05"
  },
  "tags": [
    {
      "name": "Cloud Phone Management",
      "description": "APIs for Cloud Phone Management."
    },
    {
      "name": "Live Streaming",
      "description": "Start, inspect, and stop Cloud Phone live streaming."
    },
    {
      "name": "Account & Quotas",
      "description": "Query wallet balance and Cloud Phone usage quotas."
    },
    {
      "name": "ADB",
      "description": "APIs for ADB."
    },
    {
      "name": "Files",
      "description": "APIs for Files."
    },
    {
      "name": "Apps",
      "description": "APIs for Apps."
    },
    {
      "name": "Schedules",
      "description": "APIs for Schedules."
    },
    {
      "name": "Touch",
      "description": "APIs for Touch."
    },
    {
      "name": "Monthly Billing",
      "description": "Query purchasable monthly plans and activate monthly Cloud Phones."
    }
  ],
  "x-tagGroups": [
    {
      "name": "",
      "tags": [
        "Cloud Phone Management",
        "Live Streaming",
        "Account & Quotas",
        "ADB",
        "Files",
        "Apps",
        "Schedules",
        "Touch",
        "Monthly Billing"
      ]
    }
  ],
  "paths": {
    "/api/balance": {
      "get": {
        "operationId": "getAccountAndCloudPhoneQuotasLocal",
        "summary": "Get Account Balance and Cloud Phone Quotas",
        "description": "Return the team's wallet balance and Cloud Phone usage allowances.\n\n- **Preconditions**: the calling member needs the cost permission. The wallet is looked up by team, so the figures are team-wide rather than per member.\n- **Effect**: none. Read-only. Safe to retry with bounded backoff.\n- **Units**: `balance` is the wallet balance **in cents**, not in currency units. `remainingDuration` is Cloud Phone minutes and `remainingConcurrency` a slot count; both are clamped at 0 rather than going negative.\n- **Contents**: exactly these three figures. Frozen wallet amounts, used-versus-granted minute splits and expiry dates exist upstream but are deliberately not exposed here.\n- **Note**: the call fails as a whole if either the wallet or the quota lookup fails; it never returns partial figures.",
        "tags": [
          "Account & Quotas"
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/BalanceResponse"
          }
        }
      }
    },
    "/api/cloudphone/monthly/skus": {
      "get": {
        "operationId": "listMonthlyCloudPhoneSkus",
        "summary": "List Purchasable Monthly Cloud Phone Plans",
        "description": "Return the monthly Cloud Phone products currently available to the calling team.\n\n- **Effect**: none. The call does not reserve capacity or charge the wallet. Read-only. Safe to retry with bounded backoff.\n- **Use**: pass the returned `skuId` to [`/api/cloudphone/create`](./local-api.yaml#operation/createUsingPOST). The price is in US cents and the current monthly term is 30 days.\n- **Empty result**: an empty `data` array means no monthly product is currently available.\n\nSee [Error Codes](../Getting%20Started/error-codes.md) for common business errors.\n- **Client version**: requires MoreLogin desktop client v2.65.0 or later; older clients do not expose this Local API route.",
        "tags": [
          "Monthly Billing"
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/MonthlyCloudPhoneSkusResponse"
          }
        }
      }
    },
    "/api/cloudphone/monthly/activate": {
      "post": {
        "operationId": "activateMonthlyCloudPhones",
        "summary": "Purchase and Activate Monthly Cloud Phones",
        "description": "Purchase and activate one to ten monthly Cloud Phones for 30 days.\n\n- **Billing warning**: **this operation charges the team wallet.**\n- **Permission**: the calling member must have **Fees / Payment Management** permission; otherwise the request returns `99012`.\n- **Create first**: create the phones with [`/api/cloudphone/create`](./local-api.yaml#operation/createUsingPOST). Creation only provisions inactive records and does not charge.\n- **Selection rules**: IDs must be distinct, belong to the team, use active 30-day monthly products and have compatible purchase states. Different monthly SKUs may be purchased together. Mixing paid and unpaid phones, phones from different paid orders, pending client orders or concurrent purchases rejects the entire request.\n- **Charging and restoration**: validation and charging are all-or-nothing, so there is no partial charge. If every phone belongs to the same paid order, the server restores the existing paid entitlement and does not charge again. The Local API, Open API and desktop client share the same order state.\n- **Completion**: success means every phone was confirmed active for 30 days. It does not power the phones on and does not enable automatic renewal.\n- **Unconfirmed activation**: when the service returns `33422`, `data.results` is still complete and preserves request order. Inspect each `status`, `expireTime` and `errorCode`; do not treat the whole result as missing.\n- **Retry**: there is no caller-supplied idempotency key. After a timeout, query [`/api/cloudphone/info`](./local-api.yaml#operation/infoUsingPOST) or [`/api/cloudphone/page`](./local-api.yaml#operation/pageUsingPOST) and inspect billing and expiry state before deciding whether to retry.\n- **Client version**: requires MoreLogin desktop client v2.65.0 or later; older clients do not expose this Local API route.\n\nDocumented business errors: `20002`, `20003`, `20004`, `20008`, `20041`, `20055`, `20068`, `20070`, `20071`, `33420`, `33421`, `33422`, `99001`, `99002`, `99012`. See [Error Codes](../Getting%20Started/error-codes.md) for what each code means. Any operation can additionally return the common codes.\n- **Client version**: requires MoreLogin desktop client v2.65.0 or later; older clients do not expose this Local API route.",
        "tags": [
          "Monthly Billing"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MonthlyCloudPhoneActivateRequest"
              },
              "example": {
                "ids": [
                  "1724032706822188",
                  "1724032729890861"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/MonthlyCloudPhoneActivateResponse"
          }
        }
      }
    },
    "/api/cloudphone/live/start": {
      "post": {
        "operationId": "startCloudPhoneLiveStreamingLocal",
        "summary": "Start Live Streaming",
        "description": "Start live streaming an uploaded MP4 on a Cloud Phone.\n\n- **Preconditions**: the phone must be powered on and not held by another member, and the device must support live streaming. The `fileId` must refer to a file uploaded as live-stream media that finished uploading; anything else is rejected as invalid or expired.\n- **Completion**: **accepted, not complete.** The response only confirms the service took the request. Poll `/cloudphone/live/status` until `liveStatus` is `1`.\n- **Note**: the MP4-only restriction is enforced when you upload the file, not here.\n- **Retry**: no deduplication; a repeat call re-issues the start command.\n\nDocumented business errors: `33300`, `33301`, `33401`, `33418`. See [Error Codes](../Getting%20Started/error-codes.md) for what each code means. Any operation can additionally return the common codes.",
        "tags": [
          "Live Streaming"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CloudPhoneLiveStartRequest"
              },
              "example": {
                "phoneId": "190000000000000001",
                "fileId": "820000000000000001"
              }
            }
          }
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/CloudPhoneLiveBooleanResponse"
          }
        }
      }
    },
    "/api/cloudphone/live/status": {
      "post": {
        "operationId": "getCloudPhoneLiveStreamingStatusLocal",
        "summary": "Get Live Streaming Status",
        "description": "Report whether a Cloud Phone is currently live streaming.\n\n- **Preconditions**: the phone must belong to your team and the device must support live streaming. Unlike start and stop, this does **not** require the phone to be powered on or claimed by you.\n- **Effect**: none. Read-only. Safe to retry with bounded backoff.\n- **Values**: `liveStatus` is `0` (not streaming) or `1` (streaming). **There is no failure state** — a start that never took effect simply stays at `0`, so bound your polling with a timeout.\n\nDocumented business errors: `33300`, `33401`. See [Error Codes](../Getting%20Started/error-codes.md) for what each code means. Any operation can additionally return the common codes.",
        "tags": [
          "Live Streaming"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CloudPhoneLivePhoneRequest"
              },
              "example": {
                "phoneId": "190000000000000001"
              }
            }
          }
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/CloudPhoneLiveStatusResponse"
          }
        }
      }
    },
    "/api/cloudphone/live/end": {
      "post": {
        "operationId": "stopCloudPhoneLiveStreamingLocal",
        "summary": "Stop Live Streaming",
        "description": "Stop live streaming on a Cloud Phone.\n\n- **Preconditions**: the phone must be powered on and not held by another member, and the device must support live streaming. **Whether a stream is actually running is not checked** — the stop command is sent regardless.\n- **Completion**: accepted, not complete. Poll `/cloudphone/live/status` until `liveStatus` is `0`.\n- **Retry**: idempotent in effect; a repeat call simply re-sends the stop command.\n\nDocumented business errors: `33300`, `33301`, `33401`. See [Error Codes](../Getting%20Started/error-codes.md) for what each code means. Any operation can additionally return the common codes.",
        "tags": [
          "Live Streaming"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CloudPhoneLivePhoneRequest"
              },
              "example": {
                "phoneId": "190000000000000001"
              }
            }
          }
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/CloudPhoneLiveBooleanResponse"
          }
        }
      }
    },
    "/api/cloudphone/uploadFile": {
      "post": {
        "summary": "Upload File (Multipart)",
        "deprecated": false,
        "description": "Upload a local file straight to a Cloud Phone (legacy multipart flow).\n\n- **Preconditions**: the phone must be powered on and not held by another member. The upload code obtained from the signed-URL step is single-use.\n- **Completion**: the response only confirms the Local API accepted the transfer. **No task id and no polling state are exposed**, so progress cannot be observed.\n- **Use instead**: `/api/cloudphone/upload/file/signedUrl` → `PUT` → `/api/cloudphone/upload/file` → `/api/cloudphone/upload/file/result` when you need observable progress and retry handling.\n- **Note**: this path is not the same operation as `/cloudphone/uploadFile` on the Open API, which registers an already-uploaded object.\n\nDocumented business errors: `33401`, `33419`. See [Error Codes](../Getting%20Started/error-codes.md) for what each code means. Any operation can additionally return the common codes.",
        "operationId": "fileUploadUsing",
        "tags": [
          "Files"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "id",
                  "file",
                  "uploadDest"
                ],
                "properties": {
                  "id": {
                    "description": "Cloud phone ID",
                    "type": "string",
                    "examples": [
                      "1661515884160372"
                    ],
                    "example": "1661515884160372"
                  },
                  "file": {
                    "format": "binary",
                    "type": "string",
                    "description": "File to upload",
                    "examples": [
                      "file://D:\\application\\apifox\\LICENSE.electron.txt"
                    ],
                    "example": "file://D:\\application\\apifox\\LICENSE.electron.txt"
                  },
                  "uploadDest": {
                    "description": "Upload destination directory",
                    "type": "string",
                    "examples": [
                      "/Download"
                    ],
                    "example": "/Download"
                  }
                }
              },
              "example": {
                "id": "1661515884160372",
                "file": "file://D:\\application\\apifox\\LICENSE.electron.txt",
                "uploadDest": "/Download"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The Local API accepted the direct upload and returns an empty JSON object.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "maxProperties": 0,
                  "properties": {}
                },
                "example": {}
              }
            }
          }
        },
        "security": []
      }
    },
    "/api/cloudphone/upload/file/signedUrl": {
      "post": {
        "operationId": "getCloudPhoneUploadSignedUrlLocal",
        "summary": "Request Temporary Upload URL",
        "deprecated": false,
        "description": "Request a pre-signed URL for uploading a file that a Cloud Phone will receive.\n\n- **Preconditions**: the phone must be powered on and not held by another member.\n- **Completion**: synchronous. **The pre-signed URL is valid for one hour.** `PUT` the file content to it, then register the upload with `/api/cloudphone/upload/file`.\n- **Note**: temporary objects are removed automatically after 7 days.\n- **Surface note**: this is the same implementation as `/cloudphone/uploadUrl` on the Open API.",
        "tags": [
          "Files"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "Cloud phone ID"
                  },
                  "fileName": {
                    "type": "string",
                    "description": "File name"
                  }
                },
                "required": [
                  "fileName",
                  "id"
                ]
              },
              "example": {
                "fileName": "icon.png",
                "id": "1666625111121936"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Success. `data` is an object with the fields `presignedUrl`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "object",
                      "properties": {
                        "presignedUrl": {
                          "type": "string",
                          "description": "Upload file url.Please use HTTP PUT request for file upload"
                        }
                      },
                      "required": [
                        "presignedUrl"
                      ]
                    },
                    "requestId": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "data",
                    "requestId"
                  ],
                  "description": "Response code, 0 indicates success,>0 indicates failure"
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": {
                    "presignedUrl": "https://example-bucket.s3.amazonaws.com/prod/cloudPhoneOpenApi/1666625111121936/20260901/demo.mp4?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Expires=3600&X-Amz-Signature=EXAMPLE"
                  },
                  "requestId": "d0b850e2c3d54279b524e9540a358e0a"
                }
              }
            },
            "headers": {}
          }
        },
        "security": []
      }
    },
    "/api/cloudphone/upload/file": {
      "post": {
        "operationId": "uploadCloudPhoneFileByUrlLocal",
        "summary": "Upload File via URL",
        "deprecated": false,
        "description": "Register an uploaded file so the Cloud Phone downloads it.\n\n- **Preconditions**: the phone must be powered on and not held by another member, and **the object must already exist at the URL**. Live-stream uploads must be MP4 and target a device that supports streaming.\n- **Completion**: **accepted, not complete.** The response returns `fileId` with an in-progress status; poll `/api/cloudphone/upload/file/result`.\n- **Surface note**: this is the same implementation as `/cloudphone/uploadFile` on the Open API. Do not confuse it with the older `/api/cloudphone/uploadFile` multipart flow on this surface.\n\nDocumented business errors: `33401`, `33419`. See [Error Codes](../Getting%20Started/error-codes.md) for what each code means. Any operation can additionally return the common codes.",
        "tags": [
          "Files"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "Cloud phone ID"
                  },
                  "url": {
                    "type": "string",
                    "description": "Upload url, which can be the link returned by the cloudphone/upload/file/signedURL interface or other publicly accessible file download address"
                  },
                  "uploadDest": {
                    "type": "string",
                    "description": "Storage directory"
                  },
                  "uploadType": {
                    "type": "integer",
                    "enum": [
                      1,
                      2
                    ],
                    "default": 1,
                    "description": "File type (1 = regular file, 2 = MP4 live-streaming file)"
                  }
                },
                "required": [
                  "url",
                  "id",
                  "uploadDest"
                ]
              },
              "example": {
                "url": "https://example-bucket.s3.amazonaws.com/prod/cloudPhoneOpenApi/1666625111121936/20260901/demo.mp4",
                "id": "1666625111121936",
                "uploadDest": "/Download",
                "uploadType": 2
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Success. `data` is an object with the fields `id`, `fileId` and `status`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Response code, 0 indicates success,>0 indicates failure"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "description": "Cloud phone id"
                        },
                        "fileId": {
                          "type": "string",
                          "description": "Upload file id"
                        },
                        "status": {
                          "type": "integer",
                          "description": "Upload status;0:uploading in progress, 1:upload successful, 2:upload failed"
                        }
                      },
                      "required": [
                        "id",
                        "fileId",
                        "status"
                      ]
                    },
                    "requestId": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "data",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": {
                    "id": "1666625111121936",
                    "fileId": "10069435",
                    "status": 0
                  },
                  "requestId": "e5d69c5e2d364106a0715dab1d9a03d3"
                }
              }
            },
            "headers": {}
          }
        },
        "security": []
      }
    },
    "/api/cloudphone/upload/file/result": {
      "post": {
        "operationId": "getCloudPhoneUploadResultLocal",
        "summary": "Get File Upload Status",
        "deprecated": false,
        "description": "Poll the status of a file upload to a Cloud Phone.\n\n- **Values**: `0` uploading, `1` succeeded, `2` failed.\n- **Empty result**: when the `fileId` cannot be found the call still succeeds but `data` is null. Treat that as “not visible yet or no longer present”, not as a failure.\n- **Cost**: the lookup scans the device file list; poll at a modest interval.\n- **Surface note**: same implementation as `/cloudphone/uploadFileResult` on the Open API.",
        "tags": [
          "Files"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string"
                  },
                  "fileId": {
                    "type": "string"
                  }
                },
                "required": [
                  "id",
                  "fileId"
                ]
              },
              "example": {
                "id": "1666625111121936",
                "fileId": "10069434"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Success. `data` is an object with the fields `id`, `fileId` and `status`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Response code, 0 indicates success,>0 indicates failure"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": [
                        "object",
                        "null"
                      ],
                      "properties": {
                        "id": {
                          "type": "string",
                          "description": "Cloud phone id"
                        },
                        "fileId": {
                          "type": "string",
                          "description": "Upload file id"
                        },
                        "status": {
                          "type": "integer",
                          "description": "Upload file status;0:uploading in progress, 1:upload successful, 2:upload failed"
                        }
                      },
                      "required": [
                        "id",
                        "fileId",
                        "status"
                      ]
                    },
                    "requestId": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "data",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": {
                    "id": "1666625111121936",
                    "fileId": "10069435",
                    "status": 0
                  },
                  "requestId": "e5d69c5e2d364106a0715dab1d9a03d3"
                }
              }
            },
            "headers": {}
          }
        },
        "security": []
      }
    },
    "/api/cloudphone/download": {
      "post": {
        "operationId": "downloadCloudPhoneFileLocal",
        "summary": "Request File Download",
        "deprecated": false,
        "description": "Download a file from a Cloud Phone.\n\n- **Preconditions**: the phone must be powered on and not held by another member.\n- **Effect**: the service scans the parent directory first and only then starts the transfer, so a missing path fails **here** rather than on the status poll. It must match a regular file, not a directory.\n- **Completion**: **accepted, not complete.** The response returns `downId`; poll `/cloudphone/download/result` until the status is succeeded, failed or cancelled. The status endpoint re-checks that the phone is still powered on and still yours.\n- **Retry**: not idempotent — each call rescans and issues a new `downId`.\n\nDocumented business errors: `33300`, `33301`, `33507`. See [Error Codes](../Getting%20Started/error-codes.md) for what each code means. Any operation can additionally return the common codes.",
        "tags": [
          "Files"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "Cloud phone ID"
                  },
                  "filePath": {
                    "type": "string",
                    "description": "file path: /sdcard/Download/a.txt\n"
                  }
                },
                "required": [
                  "filePath",
                  "id"
                ]
              },
              "example": {
                "filePath": "/sdcard/Download/report.csv",
                "id": "1661515884160372"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Success. `data` is an object with the fields `id` and `downId`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Response code, 0 indicates success,>0 indicates failure"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "description": "Cloud phone id"
                        },
                        "downId": {
                          "type": "string",
                          "description": "File download id "
                        }
                      },
                      "required": [
                        "id",
                        "downId"
                      ]
                    },
                    "requestId": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "data",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": "",
                  "data": {
                    "id": "1661515884160372",
                    "downId": "1661515884160999"
                  },
                  "requestId": "7dcf166a597842139af5ce12d25fe0f8"
                }
              }
            },
            "headers": {}
          }
        },
        "security": []
      }
    },
    "/api/cloudphone/download/result": {
      "post": {
        "operationId": "getCloudPhoneDownloadResultLocal",
        "summary": "Get File Download Status",
        "deprecated": false,
        "description": "Poll the status of a file download from a Cloud Phone.\n\n- **Preconditions**: the phone must be powered on and not held by another member. Pass the `downId` returned by the download request.\n- **Values**: **a different scale from uploads** — `10` running, `20` succeeded, `30` failed, `40` cancelled. `downUrl` is only populated once the download has succeeded.\n- **Note**: “file does not exist” is reported by the download request itself, which scans the parent directory first, not by this endpoint.",
        "tags": [
          "Files"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "Cloud phone ID"
                  },
                  "downId": {
                    "type": "string",
                    "description": "File download ID"
                  }
                },
                "required": [
                  "downId",
                  "id"
                ]
              },
              "example": {
                "downId": "1661515884160999",
                "id": "1661515884160372"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Success. `data` is an object with the fields `status`, `downId` and `downUrl`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Response code, 0 indicates success,>0 indicates failure"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "object",
                      "properties": {
                        "status": {
                          "type": "integer",
                          "description": "Download file status;10:Running, 20:Successful, 30:Failed, 40:Cancelled"
                        },
                        "downUrl": {
                          "type": "string",
                          "description": "File download URL; use it only when status is 20"
                        },
                        "downId": {
                          "type": "string",
                          "description": "File download task ID"
                        }
                      },
                      "required": [
                        "status",
                        "downId"
                      ]
                    },
                    "requestId": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "data",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": {
                    "status": 20,
                    "downId": "1661515884160999",
                    "downUrl": "https://get.morelogin.com/..."
                  },
                  "requestId": "17d9dbfd958e4f40a51897520138d3ff"
                }
              }
            },
            "headers": {}
          }
        },
        "security": []
      }
    },
    "/api/cloudphone/setKeyBox": {
      "post": {
        "operationId": "setCloudPhoneKeyBoxLocal",
        "summary": "Configure Keybox",
        "deprecated": false,
        "description": "Install a keybox certificate on a Cloud Phone.\n\n- **Preconditions**: `filePath` must point to an `.xml` file, and the phone must be powered on and not held by another member.\n- **Effect**: hands the certificate path to the device service. MoreLogin stores nothing, and the service defines no activation step — whether the device needs a restart for the certificate to take effect is device-specific behaviour.\n- **Completion**: synchronous acceptance by the service. There is no endpoint that reports the installed certificate.",
        "tags": [
          "Files"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "filePath": {
                    "type": "string",
                    "description": "File path, e.g., /sdcard/Download/xxx.xml"
                  },
                  "id": {
                    "type": "string",
                    "description": "Cloud phone ID"
                  }
                }
              },
              "example": {
                "filePath": "",
                "id": "0"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success. `data` is a single boolean value.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Response code: 0 = success, >0 = error"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "boolean"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Unique request identifier; include it when contacting support"
                    }
                  }
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": true,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            },
            "headers": {}
          }
        },
        "security": []
      }
    },
    "/api/cloudphone/app/install": {
      "post": {
        "operationId": "installCloudPhoneAppLocal",
        "summary": "Install app on cloud phone",
        "deprecated": false,
        "description": "Install an app from the team app library onto a Cloud Phone.\n\n- **Preconditions**: the phone must be powered on and not held by another member. The app must already exist in the team library or the public catalogue — identify it either by `appVersionId`, or by `packageName` plus `versionCode`. The app must also be available for installation on this phone, otherwise installation fails.\n- **Rate limit**: at most one install per phone per second; a faster second call is rejected.\n- **Completion**: **accepted, not complete.** The response only confirms the request was queued. Poll `/cloudphone/app/installedList` to see whether the app arrived.\n- **Retry**: safe to retry after checking the installed list, subject to the one-per-second limit.\n\nDocumented business errors: `33005`, `33014`, `33714`. See [Error Codes](../Getting%20Started/error-codes.md) for what each code means. Any operation can additionally return the common codes.",
        "tags": [
          "Apps"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "appVersionId": {
                    "description": "App version ID",
                    "type": "string"
                  },
                  "id": {
                    "description": "Cloud phone ID",
                    "type": "string"
                  },
                  "packageName": {
                    "description": "Package name — required only if appVersionId is not provided",
                    "type": "string"
                  },
                  "versionCode": {
                    "description": "Version code — required only if appVersionId is not provided",
                    "type": "integer"
                  }
                },
                "required": [
                  "id"
                ]
              },
              "example": {
                "appVersionId": "1672940217990530",
                "id": "1673823102599682"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success. `data` is a single boolean value.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "boolean"
                    },
                    "requestId": {
                      "type": "string"
                    }
                  }
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": true,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            },
            "headers": {}
          }
        },
        "security": []
      }
    },
    "/api/cloudphone/app/page": {
      "post": {
        "operationId": "listCloudPhoneAppsLocal",
        "summary": "List Available Apps",
        "deprecated": false,
        "description": "List apps that can be installed on a Cloud Phone.\n\n- **Effect**: none. Read-only. Safe to retry with bounded backoff. No Cloud Phone is involved, so the phone does not need to be running.\n- **Contents**: the public app catalogue — globally available apps plus apps published to your team. Each entry carries its versions in `appVersionList`, newest first; take `appVersionList[].id` as the `appVersionId` for `/cloudphone/app/install`.\n- **Paging caveat**: results are re-sorted after the page is fetched, so ordering is stable only within a page and `total` reflects the current page rather than the whole catalogue. Use `pages` for navigation.",
        "tags": [
          "Apps"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "appName": {
                    "description": "App name (partial match)",
                    "type": "string"
                  },
                  "pageNum": {
                    "description": "Page number; Default:1",
                    "type": "integer"
                  },
                  "pageSize": {
                    "description": "Items per page; Default:10",
                    "type": "integer"
                  }
                }
              },
              "example": {
                "appName": "de",
                "pageNum": 1,
                "pageSize": 10
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success. `data.dataList` holds the apps available to your team for the requested page; each app carries its versions in `appVersionList`, newest first. `data.total` is the number of records on this page, not the overall count — use `data.pages` for paging.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "object",
                      "properties": {
                        "total": {
                          "type": "string",
                          "description": "Number of records on the current page"
                        },
                        "current": {
                          "type": "string",
                          "description": "Current page number"
                        },
                        "pages": {
                          "type": "string",
                          "description": "Total number of pages"
                        },
                        "dataList": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "id": {
                                "type": "string",
                                "description": "App ID. This is not the value `/cloudphone/app/install` expects."
                              },
                              "appName": {
                                "type": "string",
                                "description": "App name"
                              },
                              "appIcon": {
                                "type": "string",
                                "description": "App icon URL"
                              },
                              "packageName": {
                                "type": "string",
                                "description": "Android package name"
                              },
                              "categoryValue": {
                                "type": "integer",
                                "description": "Category ID"
                              },
                              "sortNo": {
                                "type": "integer",
                                "description": "Sort order used by the app library"
                              },
                              "appVersionList": {
                                "type": "array",
                                "description": "Versions of this app, ordered by `versionCode` descending (newest first)",
                                "items": {
                                  "type": "object",
                                  "properties": {
                                    "id": {
                                      "type": "string",
                                      "description": "App version ID. Pass this as `appVersionId` to `/cloudphone/app/install`."
                                    },
                                    "versionCode": {
                                      "type": "string",
                                      "description": "Version code"
                                    },
                                    "versionName": {
                                      "type": "string",
                                      "description": "Version display name"
                                    },
                                    "installStatus": {
                                      "type": [
                                        "integer",
                                        "null"
                                      ],
                                      "description": "Always null for this operation. Query installation state with `/cloudphone/app/installedList`."
                                    },
                                    "packageName": {
                                      "type": [
                                        "string",
                                        "null"
                                      ],
                                      "description": "Always null for this operation; read `packageName` from the app instead."
                                    }
                                  }
                                }
                              }
                            }
                          }
                        }
                      }
                    },
                    "requestId": {
                      "type": "string"
                    }
                  }
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": {
                    "total": "1",
                    "current": "1",
                    "pages": "1",
                    "dataList": [
                      {
                        "id": "1672940217990529",
                        "appName": "Depop",
                        "appIcon": "https://cdn.morelogin.com/app/depop.png",
                        "packageName": "com.depop",
                        "categoryValue": 1,
                        "sortNo": 0,
                        "appVersionList": [
                          {
                            "id": "1672940217990530",
                            "versionCode": "450000000",
                            "versionName": "4.50.0",
                            "installStatus": null,
                            "packageName": null
                          }
                        ]
                      }
                    ]
                  },
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            },
            "headers": {}
          }
        },
        "security": []
      }
    },
    "/api/cloudphone/team/app/page": {
      "post": {
        "operationId": "listTeamCloudPhoneAppsLocal",
        "summary": "List Team Apps",
        "deprecated": false,
        "description": "List your team's own app library, including pre-installed apps.\n\n- **Effect**: none. Read-only. Safe to retry with bounded backoff.\n- **Contents**: a different source from `/cloudphone/app/page` — these are apps your team uploaded, returned flat (one row per app version) rather than nested by version. Entries carry a review status; while an update is in progress the status fields describe **the version being updated**, not the live one.\n- **Note**: filtering by an unrecognised proxy type returns an empty page rather than an error.",
        "tags": [
          "Apps"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "appName": {
                    "description": "App name (partial match)",
                    "type": "string"
                  },
                  "pageNo": {
                    "description": "Current page; default 1",
                    "type": "integer"
                  },
                  "pageSize": {
                    "description": "Items per page; default 10",
                    "type": "integer"
                  }
                }
              },
              "example": {
                "appName": "TikTok",
                "pageNo": 1,
                "pageSize": 10
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success. `data.dataList` holds the records for the requested page and is an empty array when there are no matches; `data.total`, `data.current` and `data.pages` describe the paging.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseDataPageResultCloudPhoneAppDto"
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": {
                    "total": "15",
                    "current": "1",
                    "pages": "2",
                    "dataList": [
                      {
                        "id": "123456",
                        "appName": "Facebook",
                        "packageName": "com.facebook.katana",
                        "versionName": "450.0.0.1",
                        "versionCode": "450000000",
                        "enabled": true,
                        "desc": "Social media application",
                        "enableRoot": false,
                        "enablePermission": true,
                        "keepAliveEnabled": false,
                        "autoStartEnabled": false,
                        "hideAppEnabled": false
                      }
                    ]
                  }
                }
              }
            },
            "headers": {}
          }
        }
      }
    },
    "/api/cloudphone/team/app/delete": {
      "post": {
        "operationId": "deleteTeamCloudPhoneAppLocal",
        "summary": "Delete Team App",
        "description": "Added in v2.70.0. The app must belong to the current team. Use the team app ID from `/api/cloudphone/team/app/page`, not a Cloud Phone ID or catalogue app ID.\n\nRemoves the team library entry and its installation scope. Does not uninstall copies already installed on phones. Do not retry automatically after a timeout; query the team app list first.\n\n**Permission**: `EXTENSION_DELETE`.\n\nDocumented business errors: `33354`. See [Error Codes](../Getting%20Started/error-codes.md) for what each code means. Any operation can additionally return the common codes.",
        "deprecated": false,
        "tags": [
          "Apps"
        ],
        "x-backend-revision": "a97d543704",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "Team app ID",
                    "pattern": "^\\d+$"
                  }
                },
                "required": [
                  "id"
                ]
              },
              "example": {
                "id": "1672940217990529"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success. The outcome is carried by code; data is null.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "null"
                    },
                    "requestId": {
                      "type": "string"
                    }
                  }
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            }
          }
        },
        "x-permission-code": "EXTENSION_DELETE"
      }
    },
    "/api/cloudphone/team/app/updateGroup": {
      "post": {
        "operationId": "updateTeamCloudPhoneAppGroupLocal",
        "summary": "Update Team App Installation Scope",
        "description": "Added in v2.70.0. The app must belong to the current team. Use the team app ID from `/api/cloudphone/team/app/page`, not a Cloud Phone ID or catalogue app ID.\n\nUpdates the authorized installation scope. When `isAll` is false, supply a non-empty `groupIds` list of groups in the current team. Saving the scope does not confirm installation on devices.\n\n**Permission**: `EXTENSION_EDIT`.\n\nDocumented business errors: `33354`, `33357`. See [Error Codes](../Getting%20Started/error-codes.md) for what each code means. Any operation can additionally return the common codes.",
        "deprecated": false,
        "tags": [
          "Apps"
        ],
        "x-backend-revision": "a97d543704",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "Team app ID",
                    "pattern": "^\\d+$"
                  },
                  "isAll": {
                    "type": "boolean",
                    "description": "All Cloud Phones"
                  },
                  "groupIds": {
                    "type": "array",
                    "description": "Team group IDs; required and non-empty when isAll is false",
                    "items": {
                      "type": "string",
                      "pattern": "^\\d+$"
                    },
                    "uniqueItems": true
                  }
                },
                "required": [
                  "id",
                  "isAll"
                ],
                "allOf": [
                  {
                    "if": {
                      "properties": {
                        "isAll": {
                          "const": false
                        }
                      },
                      "required": [
                        "isAll"
                      ]
                    },
                    "then": {
                      "required": [
                        "groupIds"
                      ],
                      "properties": {
                        "id": {},
                        "isAll": {},
                        "groupIds": {
                          "minItems": 1
                        }
                      }
                    }
                  }
                ]
              },
              "example": {
                "id": "1672940217990529",
                "isAll": false,
                "groupIds": [
                  "1672940217990540"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success. The outcome is carried by code; data is null.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "null"
                    },
                    "requestId": {
                      "type": "string"
                    }
                  }
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            }
          }
        },
        "x-permission-code": "EXTENSION_EDIT"
      }
    },
    "/api/cloudphone/team/app/enable": {
      "post": {
        "operationId": "enableTeamCloudPhoneAppLocal",
        "summary": "Enable Team App Preinstallation",
        "description": "Added in v2.70.0. The app must belong to the current team. Use the team app ID from `/api/cloudphone/team/app/page`, not a Cloud Phone ID or catalogue app ID.\n\nSaves whether the app is preinstalled at boot. Enabling is subject to the team app limit. Does not report installation completion.\n\n**Permission**: `EXTENSION_EDIT`.\n\nDocumented business errors: `33354`, `33369`. See [Error Codes](../Getting%20Started/error-codes.md) for what each code means. Any operation can additionally return the common codes.",
        "deprecated": false,
        "tags": [
          "Apps"
        ],
        "x-backend-revision": "a97d543704",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "Team app ID",
                    "pattern": "^\\d+$"
                  },
                  "enabled": {
                    "type": "boolean",
                    "description": "Whether enabled"
                  }
                },
                "required": [
                  "id",
                  "enabled"
                ]
              },
              "example": {
                "id": "1672940217990529",
                "enabled": true
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success. The outcome is carried by code; data is null.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "null"
                    },
                    "requestId": {
                      "type": "string"
                    }
                  }
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            }
          }
        },
        "x-permission-code": "EXTENSION_EDIT"
      }
    },
    "/api/cloudphone/team/app/updateInstallSetting": {
      "post": {
        "operationId": "updateTeamCloudPhoneAppInstallSettingLocal",
        "summary": "Update Team App Installation Policy",
        "description": "Added in v2.70.0. The app must belong to the current team. Use the team app ID from `/api/cloudphone/team/app/page`, not a Cloud Phone ID or catalogue app ID.\n\nSaves the boot-time installation policy: `1` overwrites an existing installation; `2` skips it.\n\n**Permission**: `EXTENSION_EDIT`.\n\nDocumented business errors: `33354`. See [Error Codes](../Getting%20Started/error-codes.md) for what each code means. Any operation can additionally return the common codes.",
        "deprecated": false,
        "tags": [
          "Apps"
        ],
        "x-backend-revision": "a97d543704",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "Team app ID",
                    "pattern": "^\\d+$"
                  },
                  "installSetting": {
                    "type": "integer",
                    "description": "Installation policy: 1 overwrite, 2 skip",
                    "enum": [
                      1,
                      2
                    ]
                  }
                },
                "required": [
                  "id",
                  "installSetting"
                ]
              },
              "example": {
                "id": "1672940217990529",
                "installSetting": 1
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success. The outcome is carried by code; data is null.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "null"
                    },
                    "requestId": {
                      "type": "string"
                    }
                  }
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            }
          }
        },
        "x-permission-code": "EXTENSION_EDIT"
      }
    },
    "/api/cloudphone/team/app/updateEnableRoot": {
      "post": {
        "operationId": "updateTeamCloudPhoneAppEnableRootLocal",
        "summary": "Update Team App ROOT Setting",
        "description": "Added in v2.70.0. The app must belong to the current team. Use the team app ID from `/api/cloudphone/team/app/page`, not a Cloud Phone ID or catalogue app ID.\n\nSaves the app ROOT switch. Enabling ROOT is rejected for packages prohibited by the service configuration.\n\n**Permission**: `EXTENSION_EDIT`.\n\nDocumented business errors: `33354`, `33370`. See [Error Codes](../Getting%20Started/error-codes.md) for what each code means. Any operation can additionally return the common codes.",
        "deprecated": false,
        "tags": [
          "Apps"
        ],
        "x-backend-revision": "a97d543704",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "Team app ID",
                    "pattern": "^\\d+$"
                  },
                  "enableRoot": {
                    "type": "boolean",
                    "description": "Whether ROOT is enabled"
                  }
                },
                "required": [
                  "id",
                  "enableRoot"
                ]
              },
              "example": {
                "id": "1672940217990529",
                "enableRoot": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success. The outcome is carried by code; data is null.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "null"
                    },
                    "requestId": {
                      "type": "string"
                    }
                  }
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            }
          }
        },
        "x-permission-code": "EXTENSION_EDIT"
      }
    },
    "/api/cloudphone/team/app/updateVersion": {
      "post": {
        "operationId": "updateTeamCloudPhoneAppVersionLocal",
        "summary": "Update Team App Target Version",
        "description": "Added in v2.70.0. The app must belong to the current team. Use the team app ID from `/api/cloudphone/team/app/page`, not a Cloud Phone ID or catalogue app ID.\n\nSelects a different available catalogue version with the same package name. Only catalogue-sourced team apps are supported. The current version is rejected. Saves the target for the boot installation flow; does not upgrade running phones immediately.\n\n**Permission**: `CLOUD_PHONE_APP_UPDATE_VERSION`.\n\nDocumented business errors: `33354`, `33368`. See [Error Codes](../Getting%20Started/error-codes.md) for what each code means. Any operation can additionally return the common codes.",
        "deprecated": false,
        "tags": [
          "Apps"
        ],
        "x-backend-revision": "a97d543704",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "Team app ID",
                    "pattern": "^\\d+$"
                  },
                  "packageName": {
                    "type": "string",
                    "description": "Application package name",
                    "minLength": 1
                  },
                  "versionCode": {
                    "type": "string",
                    "description": "Target version code as a decimal string",
                    "pattern": "^\\d+$"
                  }
                },
                "required": [
                  "id",
                  "packageName",
                  "versionCode"
                ]
              },
              "example": {
                "id": "1672940217990529",
                "packageName": "com.facebook.katana",
                "versionCode": "450000000"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success. The outcome is carried by code; data is null.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "null"
                    },
                    "requestId": {
                      "type": "string"
                    }
                  }
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            }
          }
        },
        "x-permission-code": "CLOUD_PHONE_APP_UPDATE_VERSION"
      }
    },
    "/api/cloudphone/team/app/updateSetting": {
      "post": {
        "operationId": "updateTeamCloudPhoneAppSettingLocal",
        "summary": "Update Team App Configuration",
        "description": "Added in v2.70.0. The app must belong to the current team. Use the team app ID from `/api/cloudphone/team/app/page`, not a Cloud Phone ID or catalogue app ID.\n\nUpdates one setting: `PERMISSION`, `KEEP_ALIVE`, `AUTO_START`, or `HIDE`. At most three team apps can enable keep-alive. `KEEP_ALIVE` and `HIDE` are also dispatched asynchronously to eligible running phones; permission and auto-start are consumed at boot. Success confirms saving, not device completion.\n\n**Permission**: `PERMISSION: CLOUD_PHONE_APP_PERMISSION; KEEP_ALIVE: CLOUD_PHONE_APP_KEEP_ALIVE; AUTO_START: CLOUD_PHONE_APP_AUTO_START; HIDE: CLOUD_PHONE_APP_HIDE`.\n\nDocumented business errors: `33354`, `33424`. See [Error Codes](../Getting%20Started/error-codes.md) for what each code means. Any operation can additionally return the common codes.",
        "deprecated": false,
        "tags": [
          "Apps"
        ],
        "x-backend-revision": "a97d543704",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "Team app ID",
                    "pattern": "^\\d+$"
                  },
                  "settingType": {
                    "type": "string",
                    "description": "Setting type: permission, keep-alive, auto-start, or hide",
                    "enum": [
                      "PERMISSION",
                      "KEEP_ALIVE",
                      "AUTO_START",
                      "HIDE"
                    ]
                  },
                  "enabled": {
                    "type": "boolean",
                    "description": "Whether enabled"
                  }
                },
                "required": [
                  "id",
                  "settingType",
                  "enabled"
                ]
              },
              "example": {
                "id": "1672940217990529",
                "settingType": "KEEP_ALIVE",
                "enabled": true
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success. The outcome is carried by code; data is null.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "null"
                    },
                    "requestId": {
                      "type": "string"
                    }
                  }
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            }
          }
        },
        "x-permission-codes": {
          "PERMISSION": "CLOUD_PHONE_APP_PERMISSION",
          "KEEP_ALIVE": "CLOUD_PHONE_APP_KEEP_ALIVE",
          "AUTO_START": "CLOUD_PHONE_APP_AUTO_START",
          "HIDE": "CLOUD_PHONE_APP_HIDE"
        }
      }
    },
    "/api/cloudphone/team/app/operate": {
      "post": {
        "operationId": "operateTeamCloudPhoneAppLocal",
        "summary": "Operate Team App in Batch",
        "description": "Added in v2.70.0. The app must belong to the current team. Use the team app ID from `/api/cloudphone/team/app/page`, not a Cloud Phone ID or catalogue app ID.\n\nRuns `START`, `STOP`, `RESTART`, or `UNINSTALL` on powered-on phones in the app scope that the caller may access. `onlyStartedByMe=true` further filters by the last starting member. No eligible target is an error. `data=true` means the batch loop finished, even if individual provider calls failed; it does not guarantee per-device success. Uninstall keeps the team app and its installation scope. Do not retry automatically.\n\n**Permission**: `CLOUD_PHONE_APP_BATCH_OPERATE`.\n\nDocumented business errors: `33354`, `33423`, `99002`. See [Error Codes](../Getting%20Started/error-codes.md) for what each code means. Any operation can additionally return the common codes.",
        "deprecated": false,
        "tags": [
          "Apps"
        ],
        "x-backend-revision": "a97d543704",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "Team app ID",
                    "pattern": "^\\d+$"
                  },
                  "operation": {
                    "type": "string",
                    "description": "Operation: start, stop, restart, or uninstall",
                    "enum": [
                      "START",
                      "STOP",
                      "RESTART",
                      "UNINSTALL"
                    ]
                  },
                  "onlyStartedByMe": {
                    "type": "boolean",
                    "description": "Only phones last started by the current member; defaults to false",
                    "default": false
                  }
                },
                "required": [
                  "id",
                  "operation"
                ]
              },
              "example": {
                "id": "1672940217990529",
                "operation": "START",
                "onlyStartedByMe": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success. data=true confirms that the batch loop finished, not that every device operation succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "boolean"
                    },
                    "requestId": {
                      "type": "string"
                    }
                  }
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": true,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            }
          }
        },
        "x-permission-code": "CLOUD_PHONE_APP_BATCH_OPERATE"
      }
    },
    "/api/cloudphone/app/installedList": {
      "post": {
        "operationId": "listInstalledCloudPhoneAppsLocal",
        "summary": "List Installed Apps",
        "deprecated": false,
        "description": "List the apps currently installed on a Cloud Phone.\n\n- **Preconditions**: the phone must belong to your team. Unlike most Cloud Phone commands this does **not** require the phone to be claimed by you, but the service is queried live, so a powered-off phone typically fails at the service rather than with a MoreLogin error.\n- **Effect**: none. Read-only. Safe to retry with bounded backoff.\n- **Use**: the completion signal for `/cloudphone/app/install` and `/cloudphone/app/uninstall`. App names and icons are filled in from the catalogue; packages that are not catalogued are returned as-is.",
        "tags": [
          "Apps"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "description": "Cloud phone ID",
                    "type": "string"
                  }
                },
                "required": [
                  "id"
                ]
              },
              "example": {
                "id": "1674550360293464"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success. `data` is an array of objects with the fields `appName`, `appIcon`, `packageName`, `versionCode` and `versionName`, and an empty array when there is nothing to return.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "appName": {
                            "type": "string"
                          },
                          "appIcon": {
                            "type": "string"
                          },
                          "packageName": {
                            "type": "string"
                          },
                          "versionCode": {
                            "type": "string"
                          },
                          "versionName": {
                            "type": "string"
                          }
                        }
                      }
                    },
                    "requestId": {
                      "type": "string"
                    }
                  }
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": [
                    {
                      "appName": "example-name",
                      "appIcon": "string",
                      "packageName": "example-name",
                      "versionCode": "string",
                      "versionName": "example-name"
                    }
                  ],
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            },
            "headers": {}
          }
        },
        "security": []
      }
    },
    "/api/cloudphone/app/start": {
      "post": {
        "operationId": "startCloudPhoneAppLocal",
        "summary": "Launch App",
        "deprecated": false,
        "description": "Launch an installed app on a Cloud Phone.\n\n- **Preconditions**: the phone must be powered on and not held by another member.\n- **Completion**: the response confirms the command reached the service, not that the app is in the foreground. There is no endpoint that reports a running app — verify with a screen capture or a shell command.\n- **Retry**: no deduplication; a repeat call dispatches the command again.\n\nDocumented business errors: `33300`, `33301`. See [Error Codes](../Getting%20Started/error-codes.md) for what each code means. Any operation can additionally return the common codes.",
        "tags": [
          "Apps"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "description": "Cloud phone ID",
                    "type": "string"
                  },
                  "packageName": {
                    "description": "App package name",
                    "type": "string"
                  }
                },
                "required": [
                  "id",
                  "packageName"
                ]
              },
              "example": {
                "id": "1674550360293464",
                "packageName": "com.depop"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success. `data` is always null for this operation; the outcome is carried by `code`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "null"
                    },
                    "requestId": {
                      "type": "string"
                    }
                  }
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            },
            "headers": {}
          }
        },
        "security": []
      }
    },
    "/api/cloudphone/app/restart": {
      "post": {
        "operationId": "restartCloudPhoneAppLocal",
        "summary": "Restart App",
        "deprecated": false,
        "description": "Restart an app on a Cloud Phone.\n\n- **Preconditions**: the phone must be powered on and not held by another member. **Whether the app is installed is not checked** — a package that is absent simply does nothing.\n- **Completion**: the response confirms the command was dispatched to the service, not that the app restarted. Confirm with `/cloudphone/app/installedList` or by observing the device.",
        "tags": [
          "Apps"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "Cloud phone ID"
                  },
                  "packageName": {
                    "type": "string",
                    "description": "App package name"
                  }
                }
              },
              "example": {
                "id": "0",
                "packageName": ""
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success. `data` is a single boolean value.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Response code: 0 = success, >0 = error"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Response msg, Error message returned if code > 0"
                    },
                    "data": {
                      "type": "boolean"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Unique request identifier; include it when contacting support"
                    }
                  },
                  "required": [
                    "msg"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": true,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            },
            "headers": {}
          }
        },
        "security": []
      }
    },
    "/api/cloudphone/app/stop": {
      "post": {
        "operationId": "stopCloudPhoneAppLocal",
        "summary": "Stop App",
        "deprecated": false,
        "description": "Stop a running app on a Cloud Phone.\n\n- **Preconditions**: the phone must be powered on and not held by another member. The app is not checked for being installed or running.\n- **Completion**: the response confirms the command was dispatched to the service, not that the app stopped.",
        "tags": [
          "Apps"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "Cloud phone ID"
                  },
                  "packageName": {
                    "type": "string",
                    "description": "App package name"
                  }
                }
              },
              "example": {
                "id": "0",
                "packageName": ""
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success. `data` is a single boolean value.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Response code: 0 = success, >0 = error"
                    },
                    "data": {
                      "type": "boolean"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Message; populated if code > 0"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Unique request identifier; include it when contacting support"
                    }
                  }
                },
                "example": {
                  "code": 0,
                  "data": true,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            },
            "headers": {}
          }
        },
        "security": []
      }
    },
    "/api/cloudphone/app/uninstall": {
      "post": {
        "operationId": "uninstallCloudPhoneAppLocal",
        "summary": "Uninstall App",
        "deprecated": false,
        "description": "Uninstall an app from a Cloud Phone.\n\n- **Preconditions**: the phone must be powered on and not held by another member.\n- **Effect**: dispatches the uninstall and updates the installation record for the phone.\n- **Completion**: the response confirms the request was accepted. Verify with `/cloudphone/app/installedList`.\n\nDocumented business errors: `33300`, `33301`. See [Error Codes](../Getting%20Started/error-codes.md) for what each code means. Any operation can additionally return the common codes.",
        "tags": [
          "Apps"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "Cloud phone ID"
                  },
                  "packageName": {
                    "type": "string",
                    "description": "App package name"
                  }
                }
              },
              "example": {
                "id": "0",
                "packageName": ""
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success. `data` is a single boolean value.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Response code: 0 = success, >0 = error"
                    },
                    "data": {
                      "type": "boolean"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Message; populated if code > 0"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Unique request identifier; include it when contacting support"
                    }
                  }
                },
                "example": {
                  "code": 0,
                  "data": true,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            },
            "headers": {}
          }
        },
        "security": []
      }
    },
    "/api/cloudphone/app/openRoot": {
      "post": {
        "tags": [
          "Apps"
        ],
        "summary": "Enable app ROOT",
        "description": "Grant ROOT to specific app packages on a Cloud Phone.\n\n- **Preconditions**: the phone must be powered on and not held by another member. Supported on compatible device models; on incompatible models the call succeeds but has no effect.\n- **Effect**: pushes the package allow-list to the device and, as a side effect, turns the ROOT switch on. **Nothing is stored by MoreLogin**, so the grant cannot be read back through the API.\n- **Completion**: synchronous acceptance by the service. When ROOT takes effect on the device is device-specific behaviour; MoreLogin does not restart the phone.\n- **Note**: there is currently no endpoint to revoke ROOT for individual packages. Use `/cloudphone/enableRoot` to turn the global switch off.\n\nDocumented business errors: `33300`, `33301`. See [Error Codes](../Getting%20Started/error-codes.md) for what each code means. Any operation can additionally return the common codes.",
        "operationId": "appOpenRoot",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ApiAppRootOperateDto"
              },
              "example": {
                "id": "12345678",
                "packageNames": [
                  "com.test"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success. `data` is a single boolean value.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Response code: 0 = success, >0 = error"
                    },
                    "data": {
                      "type": "boolean"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Message; populated if code > 0"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Unique request identifier; include it when contacting support"
                    }
                  }
                },
                "example": {
                  "code": 0,
                  "data": true,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            },
            "headers": {}
          }
        }
      }
    },
    "/api/cloudphone/app/setHideAccessibilityApp": {
      "post": {
        "operationId": "setCloudPhoneAccessibilityAppHiddenLocal",
        "summary": "Configure App Accessibility Hiding",
        "deprecated": false,
        "description": "Hide apps from the Android accessibility service list on one or more Cloud Phones.\n\n- **Preconditions**: 1 to 100 phone ids and 1 to 100 package names. The phones must belong to your team, but they do **not** need to be powered on or claimed by you. When none of the ids resolves, the call returns a business failure rather than an error.\n- **Effect**: the list is pushed to the service and **not stored by MoreLogin**, so it cannot be read back. Supported on some models and Some device models; on other device models the call succeeds with no effect.\n- **Completion**: synchronous. On some models each package is sent as a separate service call, so a long list takes proportionally longer and a failure part-way through leaves the earlier packages applied.\n- **Note**: MoreLogin applies no Android version check — the documented model restriction comes from service capability, and package names are passed through verbatim.",
        "tags": [
          "Apps"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "ids": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Cloud phone IDs"
                  },
                  "packageName": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "App package name, An empty string is equivalent to clearing, while * or ALL hides all applications."
                  }
                }
              },
              "example": {
                "ids": [
                  "0"
                ],
                "packageName": [
                  "*"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success. `data` is a single boolean value.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Response code: 0 = success, >0 = error"
                    },
                    "data": {
                      "type": "boolean"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Message; populated if code > 0"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Unique request identifier; include it when contacting support"
                    }
                  }
                },
                "example": {
                  "code": 0,
                  "data": true,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            },
            "headers": {}
          }
        },
        "security": []
      }
    },
    "/api/cloudphone/page": {
      "post": {
        "summary": "List Cloud Phone Profiles",
        "description": "List the Cloud Phones visible to the authenticated team, page by page.\n\n- **Effect**: none. Read-only. Safe to retry with bounded backoff.\n- **Note**: phones of all device types are returned. Passwords of managed and dynamic proxies are removed from the response.\n- **Use**: this and `/cloudphone/info` are the completion signals for the asynchronous power, one-click-new-device and provisioning operations.",
        "operationId": "pageUsingPOST",
        "tags": [
          "Cloud Phone Management"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "bindIp": {
                    "type": "boolean",
                    "description": "Whether IP is bound: true = bound, false = not",
                    "example": false
                  },
                  "keyword": {
                    "type": "string",
                    "description": "Keyword to filter: proxy info, group name, tag name, environment name",
                    "example": "CP-424"
                  },
                  "pageNo": {
                    "type": "integer",
                    "format": "int64",
                    "description": "Current page",
                    "example": 1
                  },
                  "pageSize": {
                    "type": "integer",
                    "format": "int64",
                    "description": "Items per page",
                    "example": 100
                  },
                  "sort": {
                    "type": "array",
                    "description": "Dynamic sort fields. Currently only \"envName\" is supported for cloud phones.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "sortDirection": {
                          "type": "string",
                          "enum": [
                            "asc",
                            "desc"
                          ],
                          "description": "Sort direction",
                          "example": "asc"
                        },
                        "sortField": {
                          "type": "string",
                          "description": "Field to sort by (only \"envName\" is currently supported)",
                          "example": "envName"
                        }
                      },
                      "required": [
                        "sortDirection",
                        "sortField"
                      ]
                    },
                    "example": [
                      {
                        "sortDirection": "asc",
                        "sortField": "envName"
                      }
                    ]
                  }
                },
                "example": {
                  "bindIp": false,
                  "keyword": "CP-424",
                  "pageNo": 1,
                  "pageSize": 100,
                  "sort": [
                    {
                      "sortDirection": "asc",
                      "sortField": "envName"
                    }
                  ]
                }
              },
              "example": {
                "bindIp": false,
                "keyword": "CP-424",
                "pageNo": 1,
                "pageSize": 100,
                "sort": [
                  {
                    "sortDirection": "asc",
                    "sortField": "envName"
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Return result code 0:Normal Other codes are exceptions."
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "error message"
                    },
                    "data": {
                      "type": "object",
                      "properties": {
                        "current": {
                          "type": "string"
                        },
                        "dataList": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/CloudPhoneProfile"
                          }
                        },
                        "pages": {
                          "type": "string"
                        },
                        "total": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "current",
                        "dataList",
                        "pages",
                        "total"
                      ]
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Operation Request ID"
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "data",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": {
                    "current": "1",
                    "dataList": [
                      {
                        "abnormalStatus": 1,
                        "adbInfo": {
                          "adbIp": "string",
                          "adbPassword": "string",
                          "adbPort": "9222",
                          "command": "string",
                          "expireTime": "2026-09-01 12:00:00",
                          "remark": "example remark",
                          "success": 1
                        },
                        "billingType": 1,
                        "createDate": "2026-09-01 12:00:00",
                        "createMember": 1,
                        "createMemberName": "example-name",
                        "enableAdb": true,
                        "envName": "example-name",
                        "envRemark": "example remark",
                        "envStatus": 1,
                        "expireTime": "2026-09-01 12:00:00",
                        "groupId": "1673823102599682",
                        "groupName": "example-name",
                        "id": "1673823102599682",
                        "androidId": "1673823102599682",
                        "gaid": "1673823102599682",
                        "lastConnectDate": "2026-09-01 12:00:00",
                        "lastConnectMemberId": "1673823102599682",
                        "lastConnectMemberName": "example-name",
                        "lastStartDate": "2026-09-01 12:00:00",
                        "lastStartMemberId": "1673823102599682",
                        "lastStartMemberName": "example-name",
                        "proxy": {
                          "country": "string",
                          "countryCode": "string",
                          "createDate": "2026-09-01 12:00:00",
                          "delFlag": 1,
                          "expiryTime": "2026-09-01 12:00:00",
                          "exportIp": "9222",
                          "groupId": "1673823102599682",
                          "id": "1673823102599682",
                          "providerCode": "string",
                          "proxyAreaCode": "string",
                          "proxyCatagoryType": 1,
                          "proxyCheckStatus": 1,
                          "proxyInfo": "string",
                          "state": "California",
                          "city": "Los Angeles",
                          "proxyIp": "string",
                          "proxyName": "example-name",
                          "proxyPort": 1080,
                          "proxyRegionCode": "string",
                          "proxyStatus": 1,
                          "proxySub": {
                            "activeRecordId": "1673823102599682",
                            "businessId": "1673823102599682",
                            "createMember": 1,
                            "endTime": "2026-09-01 12:00:00",
                            "id": "1673823102599682",
                            "nextBillingTime": "2026-09-01 12:00:00",
                            "startTime": "2026-09-01 12:00:00",
                            "subPayMethod": "string",
                            "subStatus": 1,
                            "subType": 1,
                            "teamId": "1673823102599682"
                          },
                          "proxyType": 1,
                          "proxyTypeCode": "string",
                          "regionKey": "string",
                          "releaseTime": "2026-09-01 12:00:00",
                          "uniqueId": 1
                        },
                        "proxyStatus": 1,
                        "supportAdb": true,
                        "tagInfos": [
                          {
                            "id": "1673823102599682",
                            "tagName": "example-name"
                          }
                        ],
                        "updateDate": "2026-09-01 12:00:00",
                        "updateMember": 1
                      }
                    ],
                    "pages": "1",
                    "total": "1"
                  },
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            }
          }
        }
      }
    },
    "/api/cloudphone/create": {
      "post": {
        "summary": "Create Cloud Phone",
        "description": "Purchase and provision one or more Cloud Phones.\n\n- **Preconditions**: the plan must have remaining capacity and the daily creation quota must not be exhausted. `country`, `timezone` and `language` are validated against the list the selected device model supports, so an unsupported combination is rejected rather than silently adjusted. Coordinates are bounded to ±180 longitude, ±90 latitude. A phone number is discarded when the chosen SKU does not support one. Monthly SKUs are supported when returned by [`/api/cloudphone/monthly/skus`](./local-api.yaml#operation/listMonthlyCloudPhoneSkus); they currently use a 30-day term.\n- **Effect**: creates the Cloud Phone records. Pay-per-minute SKUs become usable after provisioning; monthly SKUs are created inactive. Creation never charges the wallet. Monthly phones are charged only by [`/api/cloudphone/monthly/activate`](./local-api.yaml#operation/activateMonthlyCloudPhones); pay-per-minute phones begin consuming balance or quota when powered on.\n- **Completion**: **accepted, not complete.** The Cloud Phone instance is not ready yet, and powering on too early is rejected. Poll [`/api/cloudphone/info`](./local-api.yaml#operation/infoUsingPOST) or [`/api/cloudphone/page`](./local-api.yaml#operation/pageUsingPOST) until `envStatus` reports the phone as powered off. For a monthly SKU, also complete [`/api/cloudphone/monthly/activate`](./local-api.yaml#operation/activateMonthlyCloudPhones) before powering it on.\n- **Retry**: not idempotent and not serialized. There is no idempotency key. Do not retry blindly after a timeout — query state first.\n\nDocumented business errors: `19064`, `20018`, `33338`, `33339`, `33340`, `33341`, `33342`, `33343`, `33344`, `33345`, `33398`, `33399`, `33400`, `33408`. See [Error Codes](../Getting%20Started/error-codes.md) for what each code means. Any operation can additionally return the common codes.",
        "operationId": "createUsingPOST",
        "tags": [
          "Cloud Phone Management"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "skuId": {
                    "type": "string",
                    "description": "Cloud Phone model\n\n| Cloud Phone model | SKU ID (`skuId`) |\n| --- | --- |\n| Android 12 | `10002` |\n| Android 13 | `10013` |\n| Android 14 | `10005` |\n| Android 15 | `10004` |\n| Android 15A | `10014` |\n| Android 16 | `10015` |\n| Android 17 | `10105` |\n\nSee [Country Time Zone Table](/api-reference/appendix/country-time-zone) for supported regions and timezone mappings\n"
                  },
                  "quantity": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 10,
                    "description": "Number of cloud phone created. Range of values:[1-10]"
                  },
                  "envRemark": {
                    "type": "string",
                    "maxLength": 1500,
                    "description": "Profile Remarks (Length limit 1500 characters)"
                  },
                  "groupId": {
                    "type": "string",
                    "description": "Group ID. Use `\"0\"` for ungrouped."
                  },
                  "groupName": {
                    "type": "string",
                    "maxLength": 50,
                    "description": "Existing group name, or a new group name to create when no matching group exists."
                  },
                  "automaticGeo": {
                    "type": "boolean",
                    "description": "Whether to automatically match the geographic location. Default:true"
                  },
                  "automaticLanguage": {
                    "type": "boolean",
                    "description": "Whether to automatically match the language. Default:true"
                  },
                  "automaticLocation": {
                    "type": "boolean",
                    "description": "Whether to auto-match location (time zone, country). Default:true"
                  },
                  "country": {
                    "type": "string",
                    "description": "Country code (e.g. `us`). See [Country Time Zone Table](/api-reference/appendix/country-time-zone) for the full list"
                  },
                  "timezone": {
                    "type": "string",
                    "description": "Time zone, e.g. America/New_York"
                  },
                  "language": {
                    "type": "string",
                    "description": "Language, e.g. en-US"
                  },
                  "altitude": {
                    "type": "number",
                    "description": "Altitude"
                  },
                  "latitude": {
                    "type": "number",
                    "description": "Latitude. Example:22.309182"
                  },
                  "longitude": {
                    "type": "number",
                    "description": "Longitude. Example:114.176817"
                  },
                  "speed": {
                    "type": "number",
                    "maximum": 400,
                    "description": "Movement speed"
                  },
                  "bearing": {
                    "type": "number",
                    "maximum": 360,
                    "description": "Direction of movement"
                  },
                  "accuracy": {
                    "type": "number",
                    "maximum": 100,
                    "description": "Horizontal accuracy"
                  },
                  "phoneNumber": {
                    "type": "string",
                    "description": "Customize your phone number. Format requirements:Must begin with a + sign, country code must be 1-3 digits (excluding 86), total length 8-14 digits, and contain only + and numbers."
                  },
                  "brand": {
                    "type": "string",
                    "description": "device brand,You can query via the https://guide.morelogin.com/api-reference/open-api/open-api/cloud-phone/paths/~1cloudphone~1brand~1models/post interface."
                  },
                  "modelId": {
                    "type": "number",
                    "description": "device model id,You can query via the https://guide.morelogin.com/api-reference/open-api/open-api/cloud-phone/paths/~1cloudphone~1brand~1models/post interface."
                  },
                  "proxyId": {
                    "type": "string",
                    "description": "Proxy ID"
                  },
                  "tags": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Tag names. Blank values are ignored."
                  }
                },
                "required": [
                  "skuId",
                  "quantity"
                ]
              },
              "example": {
                "skuId": "1661515884160372",
                "quantity": 1
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "This is Cloud phone IDS"
                    },
                    "requestId": {
                      "type": "string"
                    },
                    "error": {
                      "type": "object",
                      "properties": {}
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": [
                    "string"
                  ],
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d",
                  "error": {}
                }
              }
            }
          }
        }
      }
    },
    "/api/cloudphone/powerOn": {
      "post": {
        "summary": "Start Cloud Phone",
        "description": "Start a Cloud Phone.\n\n- **Preconditions**: the phone must currently be powered off. It is rejected when the SKU is delisted or under maintenance, when the phone is held by another member, while its proxy is still being checked, when the account is in arrears or the phone is deactivated, when a monthly term has expired, and when neither free minutes, a concurrency slot nor a positive balance is available. Some models additionally require the latest Windows client.\n- **Effect**: marks the phone as booting, claims it for the calling member, and reserves a concurrency slot or starts consuming time. The response reports which of the two was used.\n- **Completion**: **accepted, not complete.** Poll `/cloudphone/info` until `envStatus` is powered on; a failure surfaces there as `errorCode` and `errorMsg`. Members with a callback host configured also receive a webhook.\n- **Retry**: a concurrent second call is rejected outright rather than queued. After a timeout, read `/cloudphone/info` — do not resend.\n\nDocumented business errors: `33300`, `33309`, `33315`, `33316`, `33317`, `33318`, `33321`, `33322`, `33323`, `33324`, `33325`, `33346`, `33347`, `33367`, `33376`, `33407`. See [Error Codes](../Getting%20Started/error-codes.md) for what each code means. Any operation can additionally return the common codes.",
        "operationId": "powerOnUsingPOST",
        "tags": [
          "Cloud Phone Management"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string"
                  },
                  "headless": {
                    "type": "boolean",
                    "description": "Display Cloud Phone Window. false:Display, true:Do not display, Default:true"
                  },
                  "disableMoneySavingMode": {
                    "type": "boolean",
                    "description": "Disable power saving mode, default:false"
                  }
                },
                "required": [
                  "id"
                ]
              },
              "example": {
                "id": "1637226321190925"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Return result code 0:Normal Other codes are exceptions."
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Error message"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Operation Request ID"
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            }
          }
        }
      }
    },
    "/api/cloudphone/restart": {
      "post": {
        "summary": "Restart Cloud Phone",
        "description": "Restart the entire Cloud Phone. Running AI tasks are terminated and in-progress app installation records are cleared.\n\nOperate on one Cloud Phone by `id`. The caller must have access to the phone; it must be activated, not released or transferring, powered on (`envStatus=4`), and not occupied by another member. Success returns `data: null` with no task ID and means submission succeeded, not completion. Query `/api/cloudphone/info` or `/api/cloudphone/page` with bounded polling: processing is `envStatus=6`, success returns to `4`, and callback failure changes it to `2`. If subscribed, use the final `cloud_phone.restart` Webhook result. There is no idempotency key: after a timeout, query state before retrying; another call after completion may execute again.\n\nDocumented business errors: `33300`, `33301`, `33310`, `33321`, `33325`, `33359`, `33382`. See [Error Codes](../Getting%20Started/error-codes.md) for what each code means. Any operation can additionally return the common codes.",
        "operationId": "restartCloudPhone",
        "tags": [
          "Cloud Phone Management"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string"
                  }
                },
                "required": [
                  "id"
                ]
              },
              "example": {
                "id": "1596527092376632"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Return result code 0:Normal Other codes are exceptions."
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Error message"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Operation Request ID"
                    },
                    "data": {
                      "type": "null"
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "requestId",
                    "data"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d",
                  "data": null
                }
              }
            }
          }
        }
      }
    },
    "/api/cloudphone/reset": {
      "post": {
        "summary": "Reset Cloud Phone",
        "description": "**Data deletion warning:** reset clears phone data and app installation records and terminates running AI tasks. Back up required data first. This is distinct from the one-click new device operation.\n\nOperate on one Cloud Phone by `id`. The caller must have access to the phone; it must be activated, not released or transferring, powered on (`envStatus=4`), and not occupied by another member. Success returns `data: null` with no task ID and means submission succeeded, not completion. Query `/api/cloudphone/info` or `/api/cloudphone/page` with bounded polling: processing is `envStatus=5`, success returns to `4`, and callback failure changes it to `2`. If subscribed, use the final `cloud_phone.reset` Webhook result. There is no idempotency key: after a timeout, query state before retrying; another call after completion may execute again.\n\nDocumented business errors: `33300`, `33301`, `33311`, `33321`, `33325`, `33359`, `33382`. See [Error Codes](../Getting%20Started/error-codes.md) for what each code means. Any operation can additionally return the common codes.",
        "operationId": "resetCloudPhone",
        "tags": [
          "Cloud Phone Management"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string"
                  }
                },
                "required": [
                  "id"
                ]
              },
              "example": {
                "id": "1596527092376632"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Return result code 0:Normal Other codes are exceptions."
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Error message"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Operation Request ID"
                    },
                    "data": {
                      "type": "null"
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "requestId",
                    "data"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d",
                  "data": null
                }
              }
            }
          }
        }
      }
    },
    "/api/cloudphone/powerOff": {
      "post": {
        "summary": "Stop Cloud Phone",
        "description": "Stop a Cloud Phone.\n\n- **Preconditions**: the phone must be booting or powered on. It cannot be stopped while held by another member, or while a one-click new device, restart or reset is in progress.\n- **Effect**: stops billing, releases the concurrency slot, settles usage, and invalidates the connection credentials issued for the session. Stopping a phone that was still booting interrupts the start instead.\n- **Completion**: billing and local state are settled synchronously; device shutdown continues afterwards, so confirm with `/cloudphone/info`.\n- **Retry**: a second call reports the phone as not running. Batches abort on the first failure, so re-read state before retrying.\n\nDocumented business errors: `33300`, `33301`, `33308`, `33331`, `33332`, `33333`. See [Error Codes](../Getting%20Started/error-codes.md) for what each code means. Any operation can additionally return the common codes.",
        "operationId": "powerOffUsingPOST",
        "tags": [
          "Cloud Phone Management"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string"
                  }
                },
                "required": [
                  "id"
                ]
              },
              "example": {
                "id": "1596527092376632"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Return result code 0:Normal Other codes are exceptions."
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Error message"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Operation Request ID"
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            }
          }
        }
      }
    },
    "/api/cloudphone/edit/batch": {
      "post": {
        "summary": "Update Cloud Phone Profile",
        "description": "Update the configuration of one or more Cloud Phones.\n\n- **Preconditions**: the phones must belong to the team. Region, language and coordinate values are validated for each device model, exactly as on create. Moving a phone into a group you are not authorized for is rejected.\n- **Effect**: overwrites the phone settings and refreshes the GPS configuration; may create tag bindings. Nothing is charged and concurrency is unaffected.\n- **Completion**: synchronous, and idempotent for the same body.",
        "operationId": "editBatchUsingPOST",
        "tags": [
          "Cloud Phone Management"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Cloud phone IDs"
                  },
                  "envName": {
                    "type": "string",
                    "maxLength": 64,
                    "minLength": 1,
                    "description": "Cloud phone name (≤64 chars)"
                  },
                  "phoneNumber": {
                    "type": "string",
                    "description": "Customize your phone number. Format requirements:Must begin with a + sign, country code must be 1-3 digits (excluding 86), total length 8-14 digits, and contain only + and numbers."
                  },
                  "powerOnBillingStrategy": {
                    "type": "integer",
                    "enum": [
                      0,
                      1
                    ],
                    "description": "Non-Monthly cloud phone billing method (0:default, 1:parallel pack only)"
                  },
                  "proxyId": {
                    "type": "string",
                    "description": "Proxy ID"
                  },
                  "groupId": {
                    "type": "string",
                    "description": "Environment group ID"
                  },
                  "groupName": {
                    "type": "string",
                    "maxLength": 50,
                    "description": "Existing group name, or a new group name to create when no matching group exists."
                  },
                  "tags": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Replacement tag names. Blank values are ignored."
                  },
                  "envRemark": {
                    "type": "string",
                    "maxLength": 1500,
                    "description": "Environment remark (≤1500 chars, line breaks supported)"
                  },
                  "automaticGeo": {
                    "type": "boolean",
                    "description": "Auto geolocation"
                  },
                  "automaticLanguage": {
                    "type": "boolean",
                    "description": "Auto language"
                  },
                  "automaticLocation": {
                    "type": "boolean",
                    "description": "Auto location (timezone & country)"
                  },
                  "country": {
                    "type": "string",
                    "description": "Country"
                  },
                  "timezone": {
                    "type": "string",
                    "description": "Timezone"
                  },
                  "language": {
                    "type": "string",
                    "description": "Language"
                  },
                  "latitude": {
                    "type": "number",
                    "description": "Latitude"
                  },
                  "longitude": {
                    "type": "number",
                    "description": "Longitude"
                  },
                  "enableRoot": {
                    "type": "boolean",
                    "description": "Enable global ROOT"
                  }
                },
                "required": [
                  "id"
                ]
              },
              "example": {
                "id": [
                  "1637238770951311"
                ],
                "proxyId": "0",
                "automaticGeo": false,
                "automaticLanguage": false,
                "automaticLocation": false,
                "country": "bo",
                "timezone": "America/La_Paz",
                "language": "de-CH",
                "latitude": 0,
                "longitude": 0
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Return result code:0,Normal Other codes are exceptions."
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Error message"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Operation Request ID"
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            }
          }
        }
      }
    },
    "/api/cloudphone/setProxy": {
      "post": {
        "tags": [
          "Cloud Phone Management"
        ],
        "summary": "Set cloud phone proxy",
        "description": "Bind a proxy to one or more Cloud Phones.\n\n- **Preconditions**: provide at least one of `ids` or `uniqueIds`. The phones must belong to your team; they do **not** need to be powered on. A supplied `proxyId` must exist, otherwise the call is rejected.\n- **Effect**: when `proxyId` is omitted or `0`, an existing proxy with identical connection details is reused and **a new proxy record is created in your team if none matches**. The proxy check state is reset and the previous proxy is remembered.\n- **Completion**: synchronous. **Phones that are powered on receive the new proxy immediately — no restart is needed**; powered-off phones pick it up on next start.\n- **Retry**: rebinding an existing `proxyId` is idempotent, but repeating a call that carries raw connection details can create another proxy record each time deduplication misses.\n\nDocumented business errors: `33300`, `33303`, `33320`, `14023`. See [Error Codes](../Getting%20Started/error-codes.md) for what each code means. Any operation can additionally return the common codes.",
        "operationId": "setProxy",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CloudPhoneSetProxyApiDto"
              },
              "example": {
                "ids": [
                  "1558968155668507"
                ],
                "uniqueIds": [
                  1001
                ],
                "proxy": {
                  "proxyIp": "192.168.1.100",
                  "proxyPort": 8080,
                  "proxyProvider": 2
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success. `data` is always null for this operation; the outcome is carried by `code`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Response code: 0 = success, >0 = error"
                    },
                    "data": {
                      "type": "null"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Message; populated if code > 0"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Unique request identifier; include it when contacting support"
                    }
                  }
                },
                "example": {
                  "code": 0,
                  "data": null,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            }
          }
        }
      }
    },
    "/api/cloudphone/delete/batch": {
      "post": {
        "summary": "Delete Cloud Phone",
        "description": "Release one or more Cloud Phones.\n\n- **Preconditions**: the phones must not be mid-transfer and the team must have no unpaid order for them. The phone does not have to be powered off.\n- **Effect**: the Cloud Phone instance is released immediately. A phone that was never activated is deleted outright; an activated phone is retained as a deactivated record, so it keeps appearing in listings with a deactivated status.\n- **Completion**: synchronous.\n- **Retry**: phones are processed one by one and the call aborts on the first failure, so a partially applied batch is possible. Re-read `/cloudphone/page` before retrying, and retry only the phones that are still active.",
        "operationId": "deleteUsingPOST",
        "tags": [
          "Cloud Phone Management"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "ids": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  }
                },
                "required": [
                  "ids"
                ]
              },
              "example": {
                "ids": [
                  "1595755686723985"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Return result code 0:Normal Other codes are exceptions."
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Error message"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Operation Request ID"
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            }
          }
        }
      }
    },
    "/api/cloudphone/newMachine": {
      "post": {
        "summary": "One-click new machine",
        "description": "Replace a Cloud Phone's device identity in place (one-click new device).\n\n- **Preconditions**: the phone must be powered on and not held by another member. A supplied brand and model must be one the phone's SKU supports. **This consumes the daily Cloud Phone creation quota**, the same quota `/cloudphone/create` uses.\n- **Effect**: pushes a new brand and model to the device, clears the installed-app records for that phone, resets its phone number, and aborts any running AI task. The exact set of identifiers the service regenerates is not defined by MoreLogin.\n- **Completion**: **accepted, not complete.** The phone sits in a one-click-new-device state; poll `/cloudphone/info` until it leaves that state.\n- **Concurrency**: while it runs, power on, power off and every command that needs a running phone are rejected. A concurrent second call is rejected rather than queued.\n\nDocumented business errors: `33300`, `33301`, `33326`. See [Error Codes](../Getting%20Started/error-codes.md) for what each code means. Any operation can additionally return the common codes.",
        "operationId": "oneNewUsingPOST",
        "tags": [
          "Cloud Phone Management"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "Cloud phone ID"
                  },
                  "brand": {
                    "type": "string",
                    "description": "Brand"
                  },
                  "modelId": {
                    "type": "integer",
                    "description": "Model ID"
                  }
                }
              },
              "example": {
                "id": "1595372958075305"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Response code:0 indicates success, >0 indicates failure"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Unique request identifier; include it when contacting support"
                    }
                  },
                  "required": [
                    "code",
                    "msg"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            }
          }
        }
      }
    },
    "/api/cloudphone/info": {
      "post": {
        "summary": "Get Cloud Phone Details",
        "description": "Return the full detail of a single Cloud Phone, including group and tag names.\n\n- **Effect**: none. Read-only. Safe to retry with bounded backoff.\n- **Use**: the primary status endpoint for asynchronous operations. `envStatus` distinguishes new, creation failed, powered off, booting, powered on, resetting, restarting and one-click-new-device in progress; `errorCode` and `errorMsg` carry the reason when an asynchronous operation failed.",
        "operationId": "infoUsingPOST",
        "tags": [
          "Cloud Phone Management"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "Cloud phone ID"
                  }
                },
                "required": [
                  "id"
                ]
              },
              "example": {
                "id": "1672532391231745"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "example": 0
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "example": null
                    },
                    "data": {
                      "$ref": "#/components/schemas/CloudPhoneDetail"
                    },
                    "requestId": {
                      "type": "string",
                      "example": "4d0f4fa68613441e9a11446a6437bb5a"
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "data",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": {
                    "id": "1673823102599682",
                    "androidId": "1673823102599682",
                    "gaid": "1673823102599682",
                    "envName": "example-name",
                    "groupId": "1673823102599682",
                    "groupName": "example-name",
                    "skuId": "1673823102599682",
                    "tagInfos": [
                      {
                        "id": "1673823102599682",
                        "tagName": "example-name"
                      }
                    ],
                    "billingType": 1,
                    "proxyStatus": 1,
                    "settings": {
                      "automaticGeo": true,
                      "automaticLocation": true,
                      "automaticLanguage": true,
                      "longitude": 1,
                      "latitude": 1
                    },
                    "device": {
                      "server": "string",
                      "countryName": "example-name",
                      "rom": 1,
                      "wifiBssid": "1673823102599682",
                      "bluetoothMac": "string"
                    },
                    "proxy": {
                      "id": "1673823102599682",
                      "proxyName": "example-name",
                      "state": "California",
                      "city": "Los Angeles",
                      "proxyPort": 1080,
                      "proxyIp": "string"
                    },
                    "lastStartMemberId": "1673823102599682",
                    "lastStartMemberName": "example-name",
                    "lastStartDate": "2026-09-01 12:00:00",
                    "lastConnectMemberId": "1673823102599682",
                    "lastConnectMemberName": "example-name",
                    "lastConnectDate": "2026-09-01 12:00:00",
                    "envStatus": 1,
                    "abnormalStatus": 1,
                    "expireTime": "2026-09-01 12:00:00",
                    "envRemark": "example remark",
                    "createMember": "string",
                    "updateMember": "2026-09-01 12:00:00",
                    "updateDate": "2026-09-01 12:00:00",
                    "createDate": "2026-09-01 12:00:00",
                    "createMemberName": "example-name"
                  },
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            }
          }
        }
      }
    },
    "/api/cloudphone/queryByAndroidId": {
      "post": {
        "summary": "Get Cloud Phone Details By AndroidId",
        "description": "Look up a Cloud Phone by the Android ID reported by the device.\n\n- **Effect**: none. Read-only. Safe to retry with bounded backoff. The phone does not need to be powered on.\n- **Returns**: the same detail structure as `/cloudphone/info`.\n- **Edge cases**: an empty `androidId` returns success with `data` set to null rather than a validation error, and if several phones share an Android ID one of them is returned arbitrarily.",
        "operationId": "queryByAndroidId",
        "tags": [
          "Cloud Phone Management"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "androidId": {
                    "type": "string",
                    "description": "The androidId of the cloud phone",
                    "example": "8f7e6d5c4b3a2f1e"
                  }
                },
                "required": [
                  "androidId"
                ]
              },
              "example": {
                "androidId": "8f7e6d5c4b3a2f1e"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "example": 0
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "example": null
                    },
                    "data": {
                      "$ref": "#/components/schemas/CloudPhoneDetail"
                    },
                    "requestId": {
                      "type": "string",
                      "example": "4d0f4fa68613441e9a11446a6437bb5a"
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "data",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": {
                    "id": "1673823102599682",
                    "androidId": "1673823102599682",
                    "gaid": "1673823102599682",
                    "envName": "example-name",
                    "groupId": "1673823102599682",
                    "groupName": "example-name",
                    "skuId": "1673823102599682",
                    "tagInfos": [
                      {
                        "id": "1673823102599682",
                        "tagName": "example-name"
                      }
                    ],
                    "billingType": 1,
                    "proxyStatus": 1,
                    "settings": {
                      "automaticGeo": true,
                      "automaticLocation": true,
                      "automaticLanguage": true,
                      "longitude": 1,
                      "latitude": 1
                    },
                    "device": {
                      "server": "string",
                      "countryName": "example-name",
                      "rom": 1,
                      "wifiBssid": "1673823102599682",
                      "bluetoothMac": "string"
                    },
                    "proxy": {
                      "id": "1673823102599682",
                      "proxyName": "example-name",
                      "state": "California",
                      "city": "Los Angeles",
                      "proxyPort": 1080,
                      "proxyIp": "string"
                    },
                    "lastStartMemberId": "1673823102599682",
                    "lastStartMemberName": "example-name",
                    "lastStartDate": "2026-09-01 12:00:00",
                    "lastConnectMemberId": "1673823102599682",
                    "lastConnectMemberName": "example-name",
                    "lastConnectDate": "2026-09-01 12:00:00",
                    "envStatus": 1,
                    "abnormalStatus": 1,
                    "expireTime": "2026-09-01 12:00:00",
                    "envRemark": "example remark",
                    "createMember": "string",
                    "updateMember": "2026-09-01 12:00:00",
                    "updateDate": "2026-09-01 12:00:00",
                    "createDate": "2026-09-01 12:00:00",
                    "createMemberName": "example-name"
                  },
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            }
          }
        }
      }
    },
    "/api/cloudphone/enableRoot": {
      "post": {
        "tags": [
          "Cloud Phone Management"
        ],
        "summary": "Enable or disable global ROOT",
        "description": "Turn the global ROOT switch on or off for a Cloud Phone.\n\n- **Preconditions**: the phone must be powered on and not held by another member. Supported on compatible device models; on incompatible models the call succeeds but has no effect.\n- **Effect**: unlike `/cloudphone/app/openRoot`, the setting **is persisted** on the phone's settings record and then pushed to the service as a device-wide switch.\n- **Completion**: synchronous. MoreLogin does not restart the phone; when the change takes effect on the device is device-specific behaviour.\n- **Retry**: idempotent.\n\nDocumented business errors: `33300`, `33301`. See [Error Codes](../Getting%20Started/error-codes.md) for what each code means. Any operation can additionally return the common codes.",
        "operationId": "enableRoot",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CloudPhoneEnableRootApiDTO"
              },
              "example": {
                "id": "1558968155668507",
                "enableRoot": true
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success. `data` is always null for this operation; the outcome is carried by `code`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Response code: 0 = success, >0 = error"
                    },
                    "data": {
                      "type": "null"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Message; populated if code > 0"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Unique request identifier; include it when contacting support"
                    }
                  }
                },
                "example": {
                  "code": 0,
                  "data": null,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            }
          }
        }
      }
    },
    "/api/cloudphone/screenCap": {
      "post": {
        "tags": [
          "Cloud Phone Management"
        ],
        "summary": "Cloud phone screen capture",
        "description": "Capture the Cloud Phone screen and return a download URL.\n\n- **Preconditions**: the phone must be powered on and not held by another member. Supported on compatible device models only; incompatible models reject the call.\n- **Effect**: on some models the screenshot file is removed from the device after it is captured.\n- **Completion**: synchronous. The response includes a temporary image download URL.\n- **Caveat**: on some models the reported expiry is a fixed one hour from the response and `success` is always true — it is not the real signature lifetime. Download promptly rather than storing the URL.\n- **Retry**: no side effect beyond the capture itself, so it is safe to repeat.",
        "operationId": "screenCap",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "id"
                ],
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "cloud phone ID",
                    "example": "1558968155668507"
                  }
                }
              },
              "example": {
                "id": "1558968155668507"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success. `data` is an object with the fields `url`, `status`, `expireAt` and `success`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Response code: 0 = success, >0 = error"
                    },
                    "data": {
                      "type": "object",
                      "properties": {
                        "url": {
                          "type": "string",
                          "description": "The screenshot access URL",
                          "example": "http://oss.morelogin.com/test.png"
                        },
                        "status": {
                          "type": "string",
                          "description": "Status representing immediate completion (\"finish\") or pending status (\"pending\")",
                          "example": "finish"
                        },
                        "expireAt": {
                          "type": "string",
                          "description": "URL expiration timestamp in milliseconds (returned only by some device models)",
                          "example": "1756024767163"
                        },
                        "success": {
                          "type": "boolean",
                          "description": "Was successfully generated",
                          "example": true
                        }
                      }
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Message; populated if code > 0"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Unique request identifier; include it when contacting support"
                    }
                  }
                },
                "example": {
                  "code": 0,
                  "data": {
                    "url": "http://oss.morelogin.com/test.png",
                    "status": "finish",
                    "expireAt": "1756024767163",
                    "success": true
                  },
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            }
          }
        }
      }
    },
    "/api/cloudphone/screenCapBase64": {
      "post": {
        "tags": [
          "Cloud Phone Management"
        ],
        "summary": "Cloud phone screen capture(response base64)",
        "description": "Capture the Cloud Phone screen and return the image inline as base64.\n\n- **Preconditions**: the phone must be powered on and not held by another member. **Supported on compatible device models only** — incompatible models reject the call.\n- **Completion**: synchronous. On failure the response carries an error message instead of image data, so check `success` before decoding.\n- **Model support**: documented as available on Android 12 and Android 15 images only.\n- **Use**: prefer this over `/cloudphone/screenCap` when you do not want to depend on a temporary download URL.",
        "operationId": "screenCapBase64",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "id"
                ],
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "cloud phone ID",
                    "example": "1558968155668507"
                  }
                }
              },
              "example": {
                "id": "1558968155668507"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success. `data` is an object with the fields `captureBase64`, `errorMessage` and `success`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Response code: 0 = success, >0 = error"
                    },
                    "data": {
                      "type": "object",
                      "properties": {
                        "captureBase64": {
                          "type": "string",
                          "description": "Base64-encoded image",
                          "example": "data:image/png;base64,/9j/4AAQSkZJRgABAQAA....."
                        },
                        "errorMessage": {
                          "type": "string",
                          "description": "error message",
                          "example": "success"
                        },
                        "success": {
                          "type": "boolean",
                          "description": "Was successfully generated",
                          "example": true
                        }
                      }
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Message; populated if code > 0"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Unique request identifier; include it when contacting support"
                    }
                  }
                },
                "example": {
                  "code": 0,
                  "data": {
                    "captureBase64": "data:image/png;base64,/9j/4AAQSkZJRgABAQAA.....",
                    "errorMessage": "success",
                    "success": true
                  },
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            }
          }
        }
      }
    },
    "/api/cloudphone/brand/models": {
      "post": {
        "operationId": "listCloudPhoneBrandsAndModelsLocal",
        "summary": "List Device Brands & Models",
        "description": "List the device brands and models a Cloud Phone SKU supports.\n\n- **Effect**: none. Read-only. Safe to retry with bounded backoff. No Cloud Phone is involved.\n- **Use**: pick a valid `brand` and `modelId` before calling `/cloudphone/create` or `/cloudphone/newMachine`, both of which reject a combination this endpoint does not return.\n- **Note**: an unknown `skuId` yields an empty list rather than an error.",
        "tags": [
          "Cloud Phone Management"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "skuId": {
                    "type": "string",
                    "description": "Cloud phone product ID"
                  }
                },
                "required": [
                  "skuId"
                ]
              },
              "example": {
                "skuId": "10002"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "requestId": {
                      "type": "string"
                    },
                    "timestamp": {
                      "type": "integer"
                    },
                    "data": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "brand": {
                            "type": "string"
                          },
                          "model": {
                            "type": "string"
                          }
                        }
                      }
                    }
                  }
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d",
                  "timestamp": 1,
                  "data": [
                    {
                      "brand": "string",
                      "model": "string"
                    }
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/api/cloudphone/updateAdb": {
      "post": {
        "summary": "Update ADB Connection Status",
        "description": "Turn ADB access on or off for one or more Cloud Phones.\n\n- **Preconditions**: only phones whose SKU supports ADB are considered; if none of the supplied phones qualifies, the call is rejected. Phones that never had an instance allocated are skipped.\n- **Effect**: sets the ADB switch with the service and persists it for the phones the service accepted.\n- **Partial failure**: if some phones succeed and others do not, **the call still reports an error**. Treat a failure as “some phones may have been changed” and re-read state.\n- **Completion**: synchronous. Read the connection details with `/cloudphone/batchAdbInfo`, which only returns data for phones that are powered on and ADB-capable.\n\nDocumented business errors: `33350`, `33401`. See [Error Codes](../Getting%20Started/error-codes.md) for what each code means. Any operation can additionally return the common codes.",
        "operationId": "updateAdbUsingPOST",
        "tags": [
          "ADB"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "enableAdb": {
                    "type": "boolean"
                  },
                  "ids": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  }
                },
                "required": [
                  "enableAdb",
                  "ids"
                ]
              },
              "example": {
                "enableAdb": true,
                "ids": [
                  "1633612946805630"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Return result code 0:Normal Other codes are exceptions."
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Error message"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Operation Request ID"
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            }
          }
        }
      }
    },
    "/api/cloudphone/batchAdbInfo": {
      "post": {
        "tags": [
          "ADB"
        ],
        "summary": "Batch Query ADB Info",
        "description": "Fetch ADB connection details for up to 200 Cloud Phones.\n\n- **Preconditions**: the phones must belong to your team. They do **not** need to be claimed by you. Details are only fetched for phones that are powered on and whose SKU supports ADB.\n- **Effect**: none. Read-only. Safe to retry with bounded backoff.\n- **Partial results**: results align with the requested ids and **never fail as a whole**. When details are unavailable, `remark` says why — the phone does not exist, is not powered on, does not support ADB, or the service lookup failed. Read `remark` before treating an empty entry as an error.\n- **Batch scope**: one request may include different device models; results are returned together.\n- **Note**: turn ADB on with `/cloudphone/updateAdb` first.",
        "operationId": "batchAdbInfo",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ApiBatchAdbInfoDto"
              },
              "example": {
                "envIds": [
                  "1674380838117474",
                  "1675787900043353"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseDataListApiBatchAdbInfoResultDto"
                },
                "example": {
                  "code": 0,
                  "msg": "success",
                  "data": [
                    {
                      "id": "1674380838117474",
                      "supportAdb": true,
                      "envStatus": 4,
                      "adbIp": "192.168.1.100",
                      "adbPassword": "abc12345",
                      "adbPort": "5555",
                      "command": null,
                      "expireTime": null,
                      "remark": null
                    },
                    {
                      "id": "1675787900043353",
                      "supportAdb": true,
                      "envStatus": 4,
                      "adbIp": "10.0.0.50",
                      "adbPassword": "xyz78900",
                      "adbPort": "22",
                      "command": "ssh -L 5555:localhost:5555 user@10.0.0.50 -p 22",
                      "expireTime": "2026-05-23 12:00:00",
                      "remark": null
                    }
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/api/cloudphone/exeCommand": {
      "post": {
        "summary": "Execute ADB Shell Command",
        "description": "Run a shell command on a Cloud Phone and return its output.\n\n- **Preconditions**: the phone must be powered on and not held by another member.\n- **Effect**: entirely determined by the command. MoreLogin stores nothing and applies **no command allow-list and no length limit**; the privileges the command runs with are set by the device service. Enable global root separately if a command needs it.\n- **Completion**: synchronous — `data` is the command output, not a task id.\n- **Retry**: there is no execution record to consult, so a timeout leaves the outcome unknown. Only retry commands you know are safe to run twice.\n\nDocumented business errors: `33300`, `33301`. See [Error Codes](../Getting%20Started/error-codes.md) for what each code means. Any operation can additionally return the common codes.",
        "operationId": "executeShellCommand",
        "tags": [
          "ADB"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "Cloud phone ID"
                  },
                  "command": {
                    "type": "string",
                    "description": "Shell command to execute"
                  }
                },
                "required": [
                  "id",
                  "command"
                ]
              },
              "example": {
                "command": "am start -n com.android.chrome/com.google.android.apps.chrome.Main",
                "id": "1674153897828425"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Response code: 0 indicates success, >0 indicates failure"
                    },
                    "data": {
                      "type": "string",
                      "description": "Response Information"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Response message:An error message will be returned when code is greater than 0"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Unique request identifier; include it when contacting support"
                    }
                  },
                  "required": [
                    "code",
                    "data",
                    "msg"
                  ]
                },
                "example": {
                  "code": 0,
                  "data": "string",
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            }
          }
        }
      }
    },
    "/api/cloudphone/rpa/template/market/page": {
      "post": {
        "operationId": "listMarketplaceRpaTemplatesLocal",
        "summary": "List Marketplace Templates",
        "deprecated": false,
        "description": "List RPA templates from the public marketplace.\n\n- **Effect**: none. Read-only. Safe to retry with bounded backoff. Templates are global, not team-scoped.\n- **Localization**: titles and descriptions are returned in the request language.\n- **Use**: `parameter` is a JSON string describing the template's variables and is what `templateParameter` must conform to when you create a schedule. It is null for templates that declare no variables.",
        "tags": [
          "Schedules"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "searchKey": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Template Name"
                  },
                  "pageNo": {
                    "type": [
                      "integer",
                      "null"
                    ],
                    "description": "Default:1"
                  },
                  "pageSize": {
                    "type": [
                      "integer",
                      "null"
                    ],
                    "description": "Default:10"
                  }
                }
              },
              "example": {
                "searchKey": null,
                "pageNo": null,
                "pageSize": null
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Success. `data.dataList` holds the records for the requested page and is an empty array when there are no matches; `data.total`, `data.current` and `data.pages` describe the paging.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Response code, 0 indicates success,>0 indicates failure"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Error msg"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Request trace id"
                    },
                    "data": {
                      "type": "object",
                      "properties": {
                        "dataList": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "id": {
                                "type": "string"
                              },
                              "title": {
                                "type": "string",
                                "description": "Market template title"
                              },
                              "parameter": {
                                "type": "string",
                                "description": "Template parameter JSON string"
                              },
                              "description": {
                                "type": "string",
                                "description": "Market template Description"
                              },
                              "appIconUrls": {
                                "type": "array",
                                "items": {
                                  "type": "string"
                                }
                              },
                              "sort": {
                                "type": "integer",
                                "description": "sort"
                              },
                              "author": {
                                "type": "string",
                                "description": "author"
                              },
                              "updateDate": {
                                "type": "string",
                                "description": "Last update time"
                              }
                            },
                            "required": [
                              "parameter"
                            ]
                          }
                        },
                        "current": {
                          "type": "string",
                          "description": "Current page number"
                        },
                        "pages": {
                          "type": "string",
                          "description": "Total pages"
                        },
                        "total": {
                          "type": "string",
                          "description": "Total count"
                        }
                      },
                      "required": [
                        "current",
                        "dataList",
                        "pages",
                        "total"
                      ]
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "data",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d",
                  "data": {
                    "dataList": [
                      {
                        "id": "1673823102599682",
                        "title": "example-title",
                        "parameter": "{\"key\":\"value\"}",
                        "description": "example description",
                        "appIconUrls": [
                          "https://example.com/resource"
                        ],
                        "sort": 1,
                        "author": "example-author",
                        "updateDate": "2026-09-01 12:00:00"
                      }
                    ],
                    "current": "1",
                    "pages": "1",
                    "total": "1"
                  }
                }
              }
            },
            "headers": {}
          }
        },
        "security": []
      }
    },
    "/api/cloudphone/rpa/template/personal/page": {
      "post": {
        "operationId": "listPersonalRpaTemplatesLocal",
        "summary": "List Personal Templates",
        "deprecated": false,
        "description": "List the RPA templates your team created.\n\n- **Effect**: none. Read-only. Safe to retry with bounded backoff.\n- **Contents**: a different store from the marketplace, scoped to your team, with plain single-language titles.\n- **Precedence**: when a template id exists in both stores, schedule creation resolves it to your team's template.\n- **Use**: `parameter` describes the template's variables, exactly as for marketplace templates.",
        "tags": [
          "Schedules"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "searchKey": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Template name"
                  },
                  "desc": {
                    "type": "string",
                    "description": "Template description"
                  },
                  "pageNo": {
                    "type": [
                      "integer",
                      "null"
                    ],
                    "description": "Default:1"
                  },
                  "pageSize": {
                    "type": [
                      "integer",
                      "null"
                    ],
                    "description": "Default:10"
                  }
                }
              },
              "example": {
                "searchKey": null,
                "desc": "string",
                "pageNo": null
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Success. `data.dataList` holds the records for the requested page and is an empty array when there are no matches; `data.total`, `data.current` and `data.pages` describe the paging.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Response code, 0 indicates success,>0 indicates failure"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Error msg"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Request trace id"
                    },
                    "data": {
                      "type": "object",
                      "properties": {
                        "dataList": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "id": {
                                "type": "string"
                              },
                              "title": {
                                "type": "string",
                                "description": "Market template title"
                              },
                              "parameter": {
                                "type": "string",
                                "description": "Template parameter JSON string"
                              },
                              "description": {
                                "type": "string",
                                "description": "Market template Description"
                              },
                              "appIconUrls": {
                                "type": "array",
                                "items": {
                                  "type": "string"
                                }
                              },
                              "sort": {
                                "type": "integer",
                                "description": "sort"
                              },
                              "updateDate": {
                                "type": "string",
                                "description": "Last update time"
                              }
                            }
                          }
                        },
                        "current": {
                          "type": "string",
                          "description": "Current page number"
                        },
                        "pages": {
                          "type": "string",
                          "description": "Total pages"
                        },
                        "total": {
                          "type": "string",
                          "description": "Total count"
                        }
                      },
                      "required": [
                        "current",
                        "dataList",
                        "pages",
                        "total"
                      ]
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "data",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d",
                  "data": {
                    "dataList": [
                      {
                        "id": "1673823102599682",
                        "title": "example-title",
                        "parameter": "{\"key\":\"value\"}",
                        "description": "example description",
                        "appIconUrls": [
                          "https://example.com/resource"
                        ],
                        "sort": 1,
                        "updateDate": "2026-09-01 12:00:00"
                      }
                    ],
                    "current": "1",
                    "pages": "1",
                    "total": "1"
                  }
                }
              }
            },
            "headers": {}
          }
        },
        "security": []
      }
    },
    "/api/cloudphone/rpa/task/page": {
      "post": {
        "operationId": "listCloudPhoneRpaTasksLocal",
        "summary": "List Schedules",
        "deprecated": false,
        "description": "List RPA schedules for the team, page by page.\n\n- **Effect**: none. Read-only. Safe to retry with bounded backoff.\n- **Use**: `taskState` on each schedule is the completion signal for `/cloudphone/rpa/task/cancel`.",
        "tags": [
          "Schedules"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "enabled": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Is the plan enabled"
                  },
                  "searchKey": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Fuzzy search across schedule name, description, and template title"
                  },
                  "taskState": {
                    "type": [
                      "integer",
                      "null"
                    ],
                    "description": "Schedule status; 0:awaiting execution; 1:Executing; 2:Execution completed 3:Cancel\n"
                  },
                  "pageNo": {
                    "type": [
                      "integer",
                      "null"
                    ],
                    "description": "default:1"
                  },
                  "pageSize": {
                    "type": [
                      "integer",
                      "null"
                    ],
                    "description": "default:10"
                  }
                }
              },
              "example": {
                "pageNo": 1,
                "pageSize": 10,
                "taskState": 0,
                "searchKey": "daily login",
                "enabled": true
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Success. `data.dataList` holds the records for the requested page and is an empty array when there are no matches; `data.total`, `data.current` and `data.pages` describe the paging.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Response code, 0 indicates success,>0 indicates failure"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Error msg"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Request trace id"
                    },
                    "data": {
                      "type": "object",
                      "properties": {
                        "dataList": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "id": {
                                "type": "string",
                                "description": "Schedule id"
                              },
                              "taskName": {
                                "type": "string",
                                "description": "Schedule Task name"
                              },
                              "createMember": {
                                "type": "string",
                                "description": "Member name"
                              },
                              "enabled": {
                                "type": "boolean",
                                "description": "Whether enabled"
                              },
                              "endTime": {
                                "type": "string",
                                "description": "Task end time"
                              },
                              "failCount": {
                                "type": "integer",
                                "description": "Number of failed executions"
                              },
                              "handleTime": {
                                "type": "string",
                                "description": "Execution start time"
                              },
                              "notes": {
                                "type": "string",
                                "description": "schedule notes"
                              },
                              "scheduleConfig": {
                                "type": "string",
                                "description": "Task schedule configuration"
                              },
                              "successCount": {
                                "type": "integer",
                                "description": "Number of successful executions"
                              },
                              "taskPreviewTimeTable": {
                                "type": "array",
                                "items": {
                                  "type": "object",
                                  "properties": {
                                    "cloudPhoneId": {
                                      "type": "string",
                                      "description": "Cloud phone ID"
                                    },
                                    "cloudPhoneName": {
                                      "type": "string",
                                      "description": "Cloud phone name"
                                    },
                                    "times": {
                                      "type": "array",
                                      "items": {
                                        "type": "string"
                                      },
                                      "description": "List of execution times"
                                    }
                                  }
                                }
                              },
                              "taskState": {
                                "type": "integer",
                                "description": "Schedule Task state. 0:waiting; 1:running; 2:completed 3:Cancel"
                              },
                              "templateId": {
                                "type": "string",
                                "description": "Template id"
                              },
                              "templateTitle": {
                                "type": "string",
                                "description": "Template title"
                              }
                            },
                            "required": [
                              "createMember"
                            ]
                          },
                          "description": "Plan list"
                        },
                        "current": {
                          "type": "string",
                          "description": "Current page number"
                        },
                        "pages": {
                          "type": "string",
                          "description": "Total pages"
                        },
                        "total": {
                          "type": "string",
                          "description": "Total count"
                        }
                      },
                      "required": [
                        "current",
                        "dataList",
                        "pages",
                        "total"
                      ]
                    }
                  },
                  "required": [
                    "code",
                    "data",
                    "msg",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d",
                  "data": {
                    "dataList": [
                      {
                        "id": "1673823102599682",
                        "taskName": "example-name",
                        "createMember": "string",
                        "enabled": true,
                        "endTime": "2026-09-01 12:00:00",
                        "failCount": 1,
                        "handleTime": "2026-09-01 12:00:00",
                        "notes": "string",
                        "scheduleConfig": "string",
                        "successCount": 1,
                        "taskPreviewTimeTable": [
                          {
                            "cloudPhoneId": "1673823102599682",
                            "cloudPhoneName": "example-name",
                            "times": [
                              "2026-09-01 12:00:00"
                            ]
                          }
                        ],
                        "taskState": 1,
                        "templateId": "1673823102599682",
                        "templateTitle": "example-title"
                      }
                    ],
                    "current": "1",
                    "pages": "1",
                    "total": "1"
                  }
                }
              }
            },
            "headers": {}
          }
        },
        "security": []
      }
    },
    "/api/cloudphone/rpa/task/save": {
      "post": {
        "operationId": "saveCloudPhoneRpaTaskLocal",
        "summary": "Creating a schedule",
        "deprecated": false,
        "description": "Save cloud phone scheduled task.\n\ntemplateParameter Parameter Specification\n 1. __Parameter Source__\nParameter keys must be extracted from the `parameter` field returned by the following APIs:\n- Get market template pages\n- Get Personal template pages\n2.  __Data Structure__\n- Submit parameters in JSON object format: `{\"key1\": \"value1\", \"key2\": \"value2\"}`\n- Final parameter values must be deserialized according to business logic before use\n3. __Common Type Parameters__\nFor the following parameter types, pass values directly in the corresponding format:\n- string: `{\"name\": \"John\"}`\n- decimal / number: `{\"amount\": 100.50}`\n- boolean: `{\"enabled\": true}`\n4. __Media Type Parameters__\nFor media parameters such as image (pic) or video (video), in addition to basic information, a fixed key `\"__Extra__\"` must be included. Example format:\n```json\n{\n    \"__Extra__\": {\n        \"pic\": {\n            \"name\": \"pic_name\",\n            \"size\": 204800\n        },\n        \"video\": {\n            \"name\": \"video_name\",\n            \"size\": 204800000\n        }\n    },\n    \"pic\": \"https://get.morelogin.com/prod/cloudPhoneTaskVideo/1556061681934880/1c62314c7e2b4d298abe8d5452d7c050/test.png\",\n    \"video\": \"https://get.morelogin.com/pre/cloudPhoneTaskVideo/1542431036481556/4c4fed83685345ae8f1505fbe0c2f123/baby.mp4\"\n}\n```\n5. __Parameter Configuration Example__\nThe following example demonstrates how to configure the `templateParameter` parameter when saving a plan using a market template:\n- __Step 1: Retrieve Template Parameters__\nCall the Market Template API:\n`GET /api/cloudphone/rpa/template/market/page`\nExtract the `parameter` field from the response, for example:\n\n```json\n\"parameter\": \"{\\\"videoDownloadUrl\\\":{\\\"type\\\":\\\"video\\\",\\\"extra\\\":{\\\"name\\\":\\\"Select Video\\\",\\\"type\\\":\\\"video\\\",\\\"required\\\":true,\\\"defaultValue\\\":{\\\"enabled\\\":false},\\\"index\\\":1,\\\"sizeLimit\\\":{\\\"value\\\":200,\\\"unit\\\":\\\"MB\\\"},\\\"formatType\\\":[\\\"mp4\\\",\\\"mov\\\"]}},\\\"videoDescription\\\":{\\\"type\\\":\\\"string\\\",\\\"extra\\\":{\\\"name\\\":\\\"Video Caption\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false,\\\"charValid\\\":{\\\"enabled\\\":true,\\\"value\\\":1000},\\\"multiline\\\":{\\\"enabled\\\":true,\\\"value\\\":3},\\\"defaultValue\\\":{\\\"enabled\\\":false},\\\"index\\\":2}},\\\"coverUrl\\\":{\\\"type\\\":\\\"image\\\",\\\"extra\\\":{\\\"name\\\":\\\"Cover Image\\\",\\\"type\\\":\\\"image\\\",\\\"required\\\":false,\\\"defaultValue\\\":{\\\"enabled\\\":false},\\\"index\\\":3,\\\"sizeLimit\\\":{\\\"value\\\":5,\\\"unit\\\":\\\"MB\\\"},\\\"formatType\\\":[\\\"jpg\\\",\\\"png\\\",\\\"jpeg\\\"]}},\\\"enableAIGC\\\":{\\\"type\\\":\\\"boolean\\\",\\\"extra\\\":{\\\"name\\\":\\\"AI Label\\\",\\\"type\\\":\\\"boolean\\\",\\\"required\\\":false,\\\"defaultValue\\\":{\\\"enabled\\\":false},\\\"index\\\":4}},\\\"productId\\\":{\\\"type\\\":\\\"string\\\",\\\"extra\\\":{\\\"name\\\":\\\"Product ID\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false,\\\"charValid\\\":{\\\"enabled\\\":true,\\\"value\\\":50},\\\"placeholder\\\":\\\"Product ID only supports digits, with a maximum of 50 characters.\\\",\\\"defaultValue\\\":{\\\"enabled\\\":false},\\\"index\\\":5}},\\\"productTitle\\\":{\\\"type\\\":\\\"string\\\",\\\"extra\\\":{\\\"name\\\":\\\"Product Title\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false,\\\"charValid\\\":{\\\"enabled\\\":true,\\\"value\\\":30},\\\"defaultValue\\\":{\\\"enabled\\\":false},\\\"index\\\":6}},\\\"getLeads\\\":{\\\"type\\\":\\\"boolean\\\",\\\"extra\\\":{\\\"name\\\":\\\"Get Leads\\\",\\\"type\\\":\\\"boolean\\\",\\\"required\\\":false,\\\"defaultValue\\\":{\\\"enabled\\\":false},\\\"index\\\":7}},\\\"comment\\\":{\\\"type\\\":\\\"string\\\",\\\"extra\\\":{\\\"name\\\":\\\"Comment\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false,\\\"charValid\\\":{\\\"enabled\\\":true,\\\"value\\\":200},\\\"multiline\\\":{\\\"enabled\\\":true,\\\"value\\\":3},\\\"defaultValue\\\":{\\\"enabled\\\":false},\\\"index\\\":8}}}\"\n```\n\n- __Step 2: Build the Parameter JSON__\nConstruct the JSON object according to the parameter requirements:\n```json\n{\n  \"__Extra__\": {\n    \"videoDownloadUrl\": {\n      \"name\": \"video_name.mp4\",\n      \"size\": 204800000\n    }\n  },\n  \"videoDownloadUrl\": \"https://get.morelogin.com/pre/cloudPhoneTaskVideo/1542431036481556/4c4fed83685345ae8f1505fbe0c2f123/baby.mp4\"\n}\n```\n- __Step 3: Escape the JSON String__\nConvert the JSON object into an escaped string format:\n```json\n\"{\\\"__Extra__\\\": {\\\"videoDownloadUrl\\\": {\\\"name\\\": \\\"video_name.mp4\\\",\\\"size\\\": 204800000}},\\\"videoDownloadUrl\\\": \\\"https://get.morelogin.com/pre/cloudPhoneTaskVideo/1542431036481556/4c4fed83685345ae8f1505fbe0c2f123/baby.mp4\\\"}\"\n```\n- __Step 4: API Call__\nPass the escaped string as the value of the `templateParameter` parameter to the target API.\n",
        "tags": [
          "Schedules"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "taskName": {
                    "type": "string",
                    "description": "Task name"
                  },
                  "templateId": {
                    "type": "string",
                    "description": "Template ID"
                  },
                  "templateType": {
                    "type": "string",
                    "description": "Template type. PERSONAL:personal; MARKET:marketplace"
                  },
                  "taskType": {
                    "type": "string",
                    "description": "Task type. TEMPORARY or SCHEDULED"
                  },
                  "notes": {
                    "type": "string",
                    "description": "Plan notes"
                  },
                  "cloudPhoneConfigs": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "cloudPhoneId": {
                          "type": "string",
                          "description": "Cloud phone ID"
                        },
                        "triggerTime": {
                          "type": "string",
                          "description": "Task execution time, UTC+0 time zone"
                        },
                        "templateParameter": {
                          "type": "string",
                          "description": "Template parameters are defined in personal templates or market templates. The parameters in the template are defined as:{\"Test\":{\"extra\":{\"type\":\"string\",\"required\":true,\"multiline\":{\"enabled\":false},\"name\":\"Test\",\"index\":1},\"type\":\"string\"}} When requesting parameters, the parameter passed is:{\"Test\":\"xxxx\"}"
                        }
                      },
                      "required": [
                        "cloudPhoneId",
                        "triggerTime",
                        "templateParameter"
                      ]
                    },
                    "description": "Collection of cloud phone schedule configurations"
                  },
                  "scheduleConfig": {
                    "type": "object",
                    "properties": {
                      "endTime": {
                        "type": "string",
                        "description": "date-time"
                      },
                      "scheduleType": {
                        "type": "string",
                        "description": "Schedule type. ONCE:one-time; DAILY:daily"
                      }
                    },
                    "required": [
                      "endTime",
                      "scheduleType"
                    ],
                    "description": "Task schedule configuration"
                  }
                },
                "required": [
                  "cloudPhoneConfigs",
                  "scheduleConfig",
                  "taskName",
                  "taskType",
                  "templateId",
                  "templateType"
                ]
              },
              "example": {
                "cloudPhoneConfigs": [
                  {
                    "cloudPhoneId": "1661515884160372",
                    "triggerTime": "string",
                    "templateParameter": "string"
                  }
                ],
                "scheduleConfig": {
                  "endTime": "string",
                  "scheduleType": "string"
                },
                "taskName": "example-name",
                "taskType": "string",
                "templateId": "1661515884160372",
                "templateType": "string"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Success. `data` is a single integer value.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Response code, 0 indicates success,>0 indicates failure"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Error msg"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Request trace id"
                    },
                    "data": {
                      "type": "integer",
                      "description": "Schedules id"
                    }
                  },
                  "required": [
                    "code",
                    "data",
                    "msg",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d",
                  "data": 1
                }
              }
            },
            "headers": {}
          }
        }
      }
    },
    "/api/cloudphone/rpa/onceTask/save": {
      "post": {
        "operationId": "saveCloudPhoneRpaOneTimeTaskLocal",
        "summary": "Create One-Time Schedule",
        "deprecated": false,
        "description": "Create a one-time scheduled task for a cloud phone using a marketplace or personal RPA template.\n\n---\n\n### `templateParameter` Reference\n\nThe `templateParameter` field accepts a **JSON-escaped string** containing key-value pairs that correspond to the template's declared parameters.\n\n#### 1. Where to find parameter keys\n\nRetrieve the `parameter` field from either:\n- `POST /api/cloudphone/rpa/template/market/page` (marketplace templates)\n- `POST /api/cloudphone/rpa/template/personal/page` (personal templates)\n\n#### 2. Supported value types\n\n| Type | Example |\n|------|---------|\n| `string` | `{\"name\": \"John\"}` |\n| `number` | `{\"amount\": 100.50}` |\n| `boolean` | `{\"enabled\": true}` |\n| `image` / `video` | See media format below |\n\n#### 3. Media parameters (image / video)\n\nMedia parameters require an additional `__Extra__` key containing file metadata:\n\nFor files already uploaded to MoreLogin Cloud Storage, use the cloud file protocol as the parameter value:\n`morelogin://cloudfile?ids=1,2`. The `ids` value is a comma-separated list of Cloud Storage file IDs.\n\n```json\n{\n  \"__Extra__\": {\n    \"pic\": { \"name\": \"photo.png\", \"size\": 204800 },\n    \"video\": { \"name\": \"clip.mp4\", \"size\": 204800000 }\n  },\n  \"pic\": \"https://example.com/photo.png\",\n  \"video\": \"https://example.com/clip.mp4\"\n}\n```\n\n#### 4. Step-by-step example\n\n**Step 1** — Call the marketplace template API and extract the `parameter` field from the response.\n\n**Step 2** — Build a JSON object with the required parameter keys and values:\n\n```json\n{\n  \"__Extra__\": {\n    \"videoDownloadUrl\": { \"name\": \"video.mp4\", \"size\": 204800000 }\n  },\n  \"videoDownloadUrl\": \"morelogin://cloudfile?ids=1,2\"\n}\n```\n\n**Step 3** — Escape the JSON object into a string:\n\n```\n\"{\\\"__Extra__\\\":{\\\"videoDownloadUrl\\\":{\\\"name\\\":\\\"video.mp4\\\",\\\"size\\\":204800000}},\\\"videoDownloadUrl\\\":\\\"morelogin://cloudfile?ids=1,2\\\"}\"\n```\n\n**Step 4** — Pass the escaped string as the `templateParameter` value in your API request.\n\nDocumented business errors: `33814`, `33818`. See [Error Codes](../Getting%20Started/error-codes.md) for what each code means. Any operation can additionally return the common codes.",
        "tags": [
          "Schedules"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "cloudPhoneId": {
                    "type": "string",
                    "description": "Cloud phone ID"
                  },
                  "scheduleName": {
                    "type": "string",
                    "description": "Schedule name"
                  },
                  "templateId": {
                    "type": "string",
                    "description": "Template ID,  Personal template or market template ID"
                  },
                  "templateParameter": {
                    "type": "string",
                    "description": "JSON-escaped string of template parameter key-value pairs. Extract parameter keys from the `parameter` field returned by the List Marketplace Templates or List Personal Templates APIs. See the endpoint description above for the full specification and step-by-step example."
                  },
                  "description": {
                    "type": "string",
                    "description": "Schedule description"
                  }
                },
                "required": [
                  "cloudPhoneId",
                  "scheduleName",
                  "templateId"
                ]
              },
              "example": {
                "cloudPhoneId": "1678331966138097",
                "scheduleName": "test",
                "templateId": "1678347487160296",
                "templateParameter": "{\"keyword\": \"abc\"}",
                "description": "schedule description"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Success. `data` is a single integer value.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Response code, 0 indicates success,>0 indicates failure"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Error msg"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Request trace id"
                    },
                    "data": {
                      "type": "integer",
                      "description": "Schedules id"
                    }
                  },
                  "required": [
                    "code",
                    "data",
                    "msg",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d",
                  "data": 1
                }
              }
            },
            "headers": {}
          }
        },
        "security": []
      }
    },
    "/api/cloudphone/rpa/task/cancel": {
      "post": {
        "operationId": "cancelCloudPhoneRpaTaskLocal",
        "summary": "Cancel Schedule",
        "deprecated": false,
        "description": "Cancel an RPA schedule and every execution of it that has not finished.\n\n- **Preconditions**: the schedule must exist in the team. A finished schedule cannot be cancelled; an already cancelled one returns success without doing anything.\n- **Effect**: the schedule is marked cancelled **synchronously**, and a cancel request is queued for each pending, waiting, executing or checking execution.\n- **Completion**: mixed. Read the schedule state from `/cloudphone/rpa/task/page`, but confirm individual executions through `/cloudphone/rpa/subTask/page` — an execution already running stops asynchronously, not at once.\n- **Retry**: idempotent.",
        "tags": [
          "Schedules"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "Plan id"
                  }
                },
                "required": [
                  "id"
                ]
              },
              "example": {
                "id": "1678919049331329"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Success. `data` is always null for this operation; the outcome is carried by `code`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Response code, 0 indicates success,>0 indicates failure"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Error msg"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Request trace id"
                    },
                    "data": {
                      "type": "null"
                    }
                  },
                  "required": [
                    "code",
                    "data",
                    "msg",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d",
                  "data": null
                }
              }
            },
            "headers": {}
          }
        },
        "security": []
      }
    },
    "/api/cloudphone/rpa/subTask/page": {
      "post": {
        "operationId": "listCloudPhoneRpaSubTasksLocal",
        "summary": "List Schedule Executions",
        "deprecated": false,
        "description": "List individual RPA executions, page by page.\n\n- **Effect**: none. Read-only. Safe to retry with bounded backoff.\n- **Status values**: `taskState` is `0` waiting, `1` running, `2` queued, `3` succeeded, `4` failed, `5` cancelled. Waiting and queued are distinguished by whether the execution is still on its original trigger time.\n- **Search caveat**: template-title search resolves titles in the current request language first, so a title that does not match that language returns an empty page rather than all executions.",
        "tags": [
          "Schedules"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "taskId": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Task id"
                  },
                  "taskName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Task name",
                    "maxLength": 255,
                    "minLength": 1
                  },
                  "taskState": {
                    "type": [
                      "integer",
                      "null"
                    ],
                    "description": "Plan status; 0:awaiting execution; 1:Executing; 2:Execution completed 3:Cancel",
                    "maximum": 9,
                    "minimum": 0
                  },
                  "templateId": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Template id",
                    "maximum": 99999999999,
                    "minimum": 0
                  },
                  "templateTitle": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Template title",
                    "maxLength": 255,
                    "minLength": 0
                  },
                  "cloudPhoneId": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "cloud phone id",
                    "example": "1559133625483282"
                  },
                  "cloudPhoneName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Cloud phone name",
                    "maxLength": 100,
                    "minLength": 0
                  },
                  "beginTime": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Task start time UTC+0 time zone",
                    "example": "2025-01-01 23:59:59"
                  },
                  "endTime": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Task end time UTC+0 time zone\n",
                    "example": "2025-01-02 23:59:59"
                  },
                  "pageNo": {
                    "type": [
                      "integer",
                      "null"
                    ],
                    "description": "Default:1",
                    "example": 1
                  },
                  "pageSize": {
                    "type": [
                      "integer",
                      "null"
                    ],
                    "description": "Default:10"
                  }
                }
              },
              "example": {
                "pageNo": 1,
                "pageSize": 10
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Success. `data.dataList` holds the records for the requested page and is an empty array when there are no matches; `data.total`, `data.current` and `data.pages` describe the paging.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Response code, 0 indicates success,>0 indicates failure"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Error msg"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Request trace id"
                    },
                    "data": {
                      "type": "object",
                      "properties": {
                        "dataList": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/ExecutionDTO"
                          }
                        },
                        "current": {
                          "type": "string",
                          "description": "Current page number"
                        },
                        "pages": {
                          "type": "string",
                          "description": "Total pages"
                        },
                        "total": {
                          "type": "string",
                          "description": "Total count"
                        }
                      },
                      "required": [
                        "current",
                        "dataList",
                        "pages",
                        "total"
                      ]
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "data",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d",
                  "data": {
                    "dataList": [
                      {
                        "id": "1673823102599682",
                        "taskName": "example-name",
                        "taskState": 1,
                        "cloudPhoneId": "1673823102599682",
                        "cloudPhoneName": "example-name",
                        "templateName": "example-name",
                        "handleFailCode": "string",
                        "handleFailReason": "string",
                        "handleResult": 1,
                        "handleResultAttachment": "string",
                        "handleTime": "2026-09-01 12:00:00",
                        "endTime": "2026-09-01 12:00:00",
                        "powerOnTime": "2026-09-01 12:00:00",
                        "triggerNextTime": "2026-09-01 12:00:00",
                        "triggerTime": "2026-09-01 12:00:00",
                        "createDate": "2026-09-01 12:00:00",
                        "createMember": "string",
                        "updateDate": "2026-09-01 12:00:00",
                        "updateMember": "2026-09-01 12:00:00"
                      }
                    ],
                    "current": "1",
                    "pages": "1",
                    "total": "1"
                  }
                }
              }
            },
            "headers": {}
          }
        },
        "security": []
      }
    },
    "/api/cloudphone/rpa/subTask/detail/{id}": {
      "post": {
        "operationId": "getCloudPhoneRpaSubTaskDetailLocal",
        "summary": "Get Execution Details",
        "deprecated": false,
        "description": "Return the detail of a single RPA execution.\n\n- **Preconditions**: the execution must belong to your team. The call fails if the execution, its schedule, or its Cloud Phone no longer exists.\n- **Effect**: none. Read-only. Safe to retry with bounded backoff.\n- **Status values**: same scale as `/cloudphone/rpa/subTask/page`.\n- **Note**: proxy details are resolved even for proxies that have since been deleted, so a historical run still shows what it used.",
        "tags": [
          "Schedules"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Execution task id",
            "required": true,
            "example": 1678919049331331,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "taskId": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Task id"
                  },
                  "taskName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Task name",
                    "maxLength": 255,
                    "minLength": 1
                  },
                  "taskState": {
                    "type": [
                      "integer",
                      "null"
                    ],
                    "description": "Plan status; 0:awaiting execution; 1:Executing; 2:Execution completed 3:Cancel",
                    "maximum": 9,
                    "minimum": 0
                  },
                  "templateId": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Template id",
                    "maximum": 99999999999,
                    "minimum": 0
                  },
                  "templateTitle": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Template title",
                    "maxLength": 255,
                    "minLength": 0
                  },
                  "cloudPhoneId": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "cloud phone id",
                    "example": "1559133625483282"
                  },
                  "cloudPhoneName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Cloud phone name",
                    "maxLength": 100,
                    "minLength": 0
                  },
                  "beginTime": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Task start time UTC+0 time zone",
                    "example": "2025-01-01 23:59:59"
                  },
                  "endTime": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Task end time UTC+0 time zone\n",
                    "example": "2025-01-02 23:59:59"
                  },
                  "pageNo": {
                    "type": [
                      "integer",
                      "null"
                    ],
                    "description": "Default:1",
                    "example": 1
                  },
                  "pageSize": {
                    "type": [
                      "integer",
                      "null"
                    ],
                    "description": "Default:10"
                  }
                }
              },
              "example": {
                "taskId": null,
                "taskName": null,
                "taskState": null
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Success. `data` is an object with the fields `id`, `taskName`, `taskState`, `cloudPhoneId`, `cloudPhoneName`, `templateName`, ….",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Response code, 0 indicates success,>0 indicates failure"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Error msg"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Request trace id"
                    },
                    "data": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "description": "Execution record id"
                        },
                        "taskName": {
                          "type": "string",
                          "description": "Schedule Task name"
                        },
                        "taskState": {
                          "type": "integer",
                          "description": "Schedule status; 0:awaiting execution; 1:Executing; 2:Execution completed 3:Cancel"
                        },
                        "cloudPhoneId": {
                          "type": "string",
                          "description": "Cloud phone ID"
                        },
                        "cloudPhoneName": {
                          "type": "string",
                          "description": "Cloud phone name"
                        },
                        "templateName": {
                          "type": "string",
                          "description": "Template title"
                        },
                        "handleFailCode": {
                          "type": "string",
                          "description": "Task failure code"
                        },
                        "handleFailReason": {
                          "type": "string",
                          "description": "Task failure reason"
                        },
                        "handleResult": {
                          "type": "integer",
                          "description": "Task result. 0:failed; 1:succeeded"
                        },
                        "handleResultAttachment": {
                          "type": "string",
                          "description": "Task execution result attachment"
                        },
                        "handleTime": {
                          "type": "string",
                          "description": "Execution time"
                        },
                        "endTime": {
                          "type": "string",
                          "description": "Task end time"
                        },
                        "powerOnTime": {
                          "type": "string",
                          "description": "Cloud phone power-on time"
                        },
                        "triggerNextTime": {
                          "type": "string",
                          "description": "Next scheduled trigger time"
                        },
                        "triggerTime": {
                          "type": "string",
                          "description": "Scheduled trigger time"
                        },
                        "createDate": {
                          "type": "string",
                          "description": "Creation time"
                        },
                        "createMember": {
                          "type": "string",
                          "description": "Creator"
                        },
                        "updateDate": {
                          "type": "string",
                          "description": "Last update time"
                        },
                        "updateMember": {
                          "type": "string",
                          "description": "Last updater"
                        }
                      }
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "data",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d",
                  "data": {
                    "id": "1673823102599682",
                    "taskName": "example-name",
                    "taskState": 1,
                    "cloudPhoneId": "1673823102599682",
                    "cloudPhoneName": "example-name",
                    "templateName": "example-name",
                    "handleFailCode": "string",
                    "handleFailReason": "string",
                    "handleResult": 1,
                    "handleResultAttachment": "string",
                    "handleTime": "2026-09-01 12:00:00",
                    "endTime": "2026-09-01 12:00:00",
                    "powerOnTime": "2026-09-01 12:00:00",
                    "triggerNextTime": "2026-09-01 12:00:00",
                    "triggerTime": "2026-09-01 12:00:00",
                    "createDate": "2026-09-01 12:00:00",
                    "createMember": "string",
                    "updateDate": "2026-09-01 12:00:00",
                    "updateMember": "2026-09-01 12:00:00"
                  }
                }
              }
            },
            "headers": {}
          }
        },
        "security": []
      }
    },
    "/api/cloudphone/rpa/subTask/cancel/{id}": {
      "post": {
        "operationId": "cancelCloudPhoneRpaSubTaskLocal",
        "summary": "Cancel Execution",
        "deprecated": false,
        "description": "Cancel a single RPA execution without touching its schedule.\n\n- **Preconditions**: the execution record must exist in the team. A finished one cannot be cancelled; an already cancelled one returns success without doing anything.\n- **Effect**: **queues a cancel request only — no state is written by this call.** The schedule keeps running and later executions are unaffected. Use `/cloudphone/rpa/task/cancel` to stop the schedule itself.\n- **Completion**: asynchronous. Poll `/cloudphone/rpa/subTask/page` or the execution detail until the state becomes cancelled. An execution that is already running is not stopped instantly.\n- **Retry**: idempotent; a repeat only re-queues the request.",
        "tags": [
          "Schedules"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "Plan id"
                  }
                },
                "required": [
                  "id"
                ]
              },
              "example": {
                "id": "1678919049331329"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Success. `data` is always null for this operation; the outcome is carried by `code`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Response code, 0 indicates success,>0 indicates failure"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Error msg"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Request trace id"
                    },
                    "data": {
                      "type": "null"
                    }
                  },
                  "required": [
                    "code",
                    "data",
                    "msg",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d",
                  "data": null
                }
              }
            },
            "headers": {}
          }
        },
        "security": []
      }
    },
    "/api/cloudphone/touch/click": {
      "post": {
        "tags": [
          "Touch"
        ],
        "summary": "Touch - Click",
        "description": "Tap a point on the Cloud Phone screen.\n\n- **Preconditions**: the phone must be powered on and not held by another member. Supported on compatible device models only; incompatible models reject the call.\n- **Coordinates**: `pos` must hold exactly two values, `[x, y]`. **They are not checked against the screen resolution** — an off-screen point is passed through to the service.\n- **Completion**: synchronous. `data.status` is `finish` when the gesture completed, or `pending` when the service queued it. Some models always report `finish`. There is no endpoint to poll a `pending` gesture.\n- **Retry**: no deduplication. Two calls are two taps, so a blind retry after a timeout can double-tap.\n- **Note**: `duration` is accepted but ignored here; only long press reads it.\n\nDocumented business errors: `33300`, `33301`, `33401`. See [Error Codes](../Getting%20Started/error-codes.md) for what each code means. Any operation can additionally return the common codes.",
        "operationId": "touchClick",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TouchClickRequest"
              },
              "example": {
                "id": "1558968155668507",
                "pos": [
                  540,
                  960
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Operation successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TouchResultResponse"
                },
                "example": {
                  "code": 0,
                  "msg": "success",
                  "data": {
                    "status": "finish"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/cloudphone/touch/doubleClick": {
      "post": {
        "tags": [
          "Touch"
        ],
        "summary": "Touch - Double Click",
        "description": "Double-tap a point on the Cloud Phone screen.\n\n- **Preconditions**: the phone must be powered on and not held by another member. Supported on compatible device models only; incompatible models reject the call.\n- **Effect**: on some models this is emulated as four touch events with fixed 50/100/50 ms gaps, so the tap rhythm is not configurable. `duration` is ignored.\n- **Completion**: synchronous. `data.status` is `finish` or `pending`, as for a single tap.\n- **Retry**: no deduplication; a repeat call double-taps again.\n\nDocumented business errors: `33300`, `33301`, `33401`. See [Error Codes](../Getting%20Started/error-codes.md) for what each code means. Any operation can additionally return the common codes.",
        "operationId": "touchDoubleClick",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TouchClickRequest"
              },
              "example": {
                "id": "1558968155668507",
                "pos": [
                  540,
                  960
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Operation successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TouchResultResponse"
                },
                "example": {
                  "code": 0,
                  "msg": "success",
                  "data": {
                    "status": "finish"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/cloudphone/touch/longClick": {
      "post": {
        "tags": [
          "Touch"
        ],
        "summary": "Touch - Long Press",
        "description": "Press and hold a point on the Cloud Phone screen.\n\n- **Preconditions**: the phone must be powered on and not held by another member. Supported on compatible device models only; incompatible models reject the call.\n- **Values**: `duration` is the hold time in milliseconds, capped at 60000. **There is no lower bound**, so a negative value passes validation and is handed to the service. On some models an omitted `duration` defaults to 1000 ms.\n- **Completion**: synchronous. `data.status` is `finish` or `pending`.\n- **Retry**: no deduplication; a repeat call presses again.\n\nDocumented business errors: `33300`, `33301`, `33401`. See [Error Codes](../Getting%20Started/error-codes.md) for what each code means. Any operation can additionally return the common codes.",
        "operationId": "touchLongClick",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TouchClickRequest"
              },
              "example": {
                "id": "1558968155668507",
                "pos": [
                  540,
                  960
                ],
                "duration": 2000
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Operation successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TouchResultResponse"
                },
                "example": {
                  "code": 0,
                  "msg": "success",
                  "data": {
                    "status": "finish"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/cloudphone/touch/swipe": {
      "post": {
        "tags": [
          "Touch"
        ],
        "summary": "Touch - Swipe",
        "description": "Swipe between two points on the Cloud Phone screen.\n\n- **Preconditions**: the phone must be powered on and not held by another member. Supported on compatible device models only; incompatible models reject the call.\n- **Values**: `pos1` is the start point and `pos2` the end point, each exactly `[x, y]`. `duration` is the gesture time in milliseconds, capped at 60000; on some models it defaults to 300 ms and the path is interpolated into five intermediate move events.\n- **Completion**: synchronous. `data.status` is `finish` or `pending`.\n- **Retry**: no deduplication; a repeat call swipes again.\n\nDocumented business errors: `33300`, `33301`, `33401`. See [Error Codes](../Getting%20Started/error-codes.md) for what each code means. Any operation can additionally return the common codes.",
        "operationId": "touchSwipe",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TouchSwipeRequest"
              },
              "example": {
                "id": "1558968155668507",
                "pos1": [
                  540,
                  1500
                ],
                "pos2": [
                  540,
                  500
                ],
                "duration": 300
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Operation successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TouchResultResponse"
                },
                "example": {
                  "code": 0,
                  "msg": "success",
                  "data": {
                    "status": "finish"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/cloudphone/touch/drag": {
      "post": {
        "tags": [
          "Touch"
        ],
        "summary": "Touch - Drag",
        "description": "Drag between two points on the Cloud Phone screen.\n\n- **Preconditions**: the phone must be powered on and not held by another member. Supported on compatible device models only; incompatible models reject the call.\n- **Note**: **on some models this is the same implementation as swipe** — the service delegates drag straight to the swipe routine, so the two are indistinguishable there. Other models have a separate drag action.\n- **Completion**: synchronous. `data.status` is `finish` or `pending`.\n- **Retry**: no deduplication; a repeat call drags again.\n\nDocumented business errors: `33300`, `33301`, `33401`. See [Error Codes](../Getting%20Started/error-codes.md) for what each code means. Any operation can additionally return the common codes.",
        "operationId": "touchDrag",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TouchSwipeRequest"
              },
              "example": {
                "id": "1558968155668507",
                "pos1": [
                  200,
                  500
                ],
                "pos2": [
                  800,
                  500
                ],
                "duration": 500
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Operation successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TouchResultResponse"
                },
                "example": {
                  "code": 0,
                  "msg": "success",
                  "data": {
                    "status": "finish"
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "ResponseDataPageResultCloudPhoneAppDto": {
        "type": "object",
        "properties": {
          "code": {
            "type": "integer",
            "description": "Status code, 0 means success",
            "example": 0
          },
          "msg": {
            "type": [
              "string",
              "null"
            ],
            "description": "Description message",
            "example": "Success"
          },
          "data": {
            "description": "Response data",
            "$ref": "#/components/schemas/PageResultCloudPhoneAppDto"
          }
        }
      },
      "PageResultCloudPhoneAppDto": {
        "type": "object",
        "properties": {
          "total": {
            "type": "string",
            "description": "Total number of records",
            "example": "15"
          },
          "current": {
            "type": "string",
            "description": "Current page number",
            "example": "1"
          },
          "pages": {
            "type": "string",
            "description": "Total number of pages",
            "example": "2"
          },
          "dataList": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CloudPhoneAppDto"
            },
            "description": "List of team applications"
          }
        }
      },
      "CloudPhoneAppDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Record ID",
            "example": "123456"
          },
          "appName": {
            "type": "string",
            "description": "Application name",
            "example": "Facebook"
          },
          "packageName": {
            "type": "string",
            "description": "Android package name",
            "example": "com.facebook.katana"
          },
          "versionName": {
            "type": "string",
            "description": "Version display name",
            "example": "450.0.0.1"
          },
          "versionCode": {
            "type": "string",
            "description": "Version code",
            "example": "450000000"
          },
          "enabled": {
            "type": "boolean",
            "description": "Whether the application is enabled",
            "example": true
          },
          "desc": {
            "type": "string",
            "description": "Application description",
            "example": "Social media application"
          },
          "enableRoot": {
            "type": "boolean",
            "description": "Whether ROOT access is enabled for the application",
            "example": false
          },
          "enablePermission": {
            "type": "boolean",
            "description": "Automatically grant permissions on subsequent installation",
            "default": true,
            "example": true
          },
          "keepAliveEnabled": {
            "type": "boolean",
            "description": "Whether app keep-alive is enabled",
            "default": false,
            "example": false
          },
          "autoStartEnabled": {
            "type": "boolean",
            "description": "Whether app auto-start at boot is enabled",
            "default": false,
            "example": false
          },
          "hideAppEnabled": {
            "type": "boolean",
            "description": "Whether app hiding is enabled",
            "default": false,
            "example": false
          }
        }
      },
      "ApiAppRootOperateDto": {
        "type": "object",
        "required": [
          "id",
          "packageNames"
        ],
        "properties": {
          "id": {
            "type": "string",
            "description": "Cloud Phone ID",
            "example": "12345678"
          },
          "packageNames": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "List of application package names to allow ROOT access",
            "example": [
              "com.test"
            ]
          }
        }
      },
      "CloudPhoneSetProxyApiDto": {
        "type": "object",
        "properties": {
          "ids": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "List of cloud phone environment IDs",
            "example": [
              "1558968155668507"
            ]
          },
          "uniqueIds": {
            "type": "array",
            "items": {
              "type": "integer"
            },
            "description": "List of display sequence IDs of cloud phone environments (used as reference mapping if envIds are not provided)",
            "example": [
              1001
            ]
          },
          "proxy": {
            "description": "Proxy settings",
            "$ref": "#/components/schemas/CloudPhoneProxyDto"
          }
        }
      },
      "CloudPhoneProxyDto": {
        "type": "object",
        "required": [
          "proxyIp",
          "proxyPort",
          "proxyProvider"
        ],
        "properties": {
          "proxyId": {
            "type": "string",
            "description": "Proxy Configuration ID (If this value is greater than 0, it means reusing an existing proxy configuration; if empty or <=0, it represents using the subsequent detailed parameters to create/update proxy details)",
            "example": "10002"
          },
          "proxyIp": {
            "type": "string",
            "description": "Proxy server IP address",
            "example": "192.168.1.100"
          },
          "proxyPort": {
            "type": "integer",
            "description": "Proxy server port",
            "minimum": 1,
            "maximum": 65535,
            "example": 8080
          },
          "proxyName": {
            "type": "string",
            "maxLength": 600,
            "description": "Proxy configuration name/description",
            "example": "test_proxy_01"
          },
          "proxyProvider": {
            "type": "integer",
            "description": "Proxy type 0:http, 1:https, 2:socks5",
            "example": 2
          },
          "username": {
            "type": "string",
            "maxLength": 200,
            "description": "Proxy authentication username",
            "example": "admin"
          },
          "password": {
            "type": "string",
            "maxLength": 100,
            "description": "Proxy authentication password",
            "example": "pwd123"
          },
          "refreshUrl": {
            "type": "string",
            "description": "API URL to refresh dynamic proxy IP",
            "example": "http://api.proxy.com/refresh"
          },
          "country": {
            "type": "string",
            "description": "Country code of the proxy location (e.g. CN, US)",
            "example": "US"
          },
          "state": {
            "type": "string",
            "description": "State/Province of the proxy location",
            "example": "California"
          },
          "city": {
            "type": "string",
            "description": "City of the proxy location",
            "example": "Los Angeles"
          }
        }
      },
      "CloudPhoneEnableRootApiDTO": {
        "type": "object",
        "required": [
          "id",
          "enableRoot"
        ],
        "properties": {
          "id": {
            "type": "string",
            "description": "Cloud Phone ID",
            "example": "1558968155668507"
          },
          "enableRoot": {
            "type": "boolean",
            "description": "Whether to enable global system-level ROOT permission",
            "example": true
          }
        }
      },
      "CloudPhoneProfile": {
        "type": "object",
        "properties": {
          "abnormalStatus": {
            "type": "integer",
            "description": "Abnormal status 0-No abnormality 1-Unactivated 2-Out-of-contract 3-Oversold 4-Deactivated"
          },
          "adbInfo": {
            "description": "ADB connection information",
            "$ref": "#/components/schemas/AdbInfo"
          },
          "billingType": {
            "type": "integer",
            "description": "Billing type: 1 = Pay-per-minute (On-demand), 2 = Monthly"
          },
          "createDate": {
            "description": "Creation time",
            "type": "string",
            "pattern": "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$"
          },
          "createMember": {
            "description": "Creator member ID",
            "type": "integer"
          },
          "createMemberName": {
            "description": "Creator member name",
            "type": "string"
          },
          "enableAdb": {
            "description": "Whether to enable ADB",
            "type": "boolean"
          },
          "envName": {
            "type": "string",
            "description": "Cloud Phone Name"
          },
          "envRemark": {
            "type": "string",
            "description": "Profile Remarks"
          },
          "envStatus": {
            "type": "integer",
            "description": "Profile Status:\n- 0: New\n- 1: Creation failed\n- 2: Powered off\n- 3: Booting\n- 4: Powered on\n- 5: Resetting\n- 6: Restarting\n- 7: One-click new machine in progress\n"
          },
          "expireTime": {
            "type": "string",
            "description": "expiration time"
          },
          "groupId": {
            "description": "Group ID",
            "type": "string"
          },
          "groupName": {
            "description": "Group name. Null when the cloud phone is ungrouped",
            "type": [
              "string",
              "null"
            ]
          },
          "id": {
            "description": "Cloud phone ID",
            "type": "string"
          },
          "androidId": {
            "type": "string",
            "description": "cloud phone android id"
          },
          "gaid": {
            "type": "string",
            "description": "cloud phone gaid"
          },
          "lastConnectDate": {
            "description": "Last connection time",
            "type": "string",
            "pattern": "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$"
          },
          "lastConnectMemberId": {
            "description": "Last connected member ID",
            "type": "string"
          },
          "lastConnectMemberName": {
            "description": "Last connected member name",
            "type": "string"
          },
          "lastStartDate": {
            "description": "Last boot time",
            "type": "string",
            "pattern": "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$"
          },
          "lastStartMemberId": {
            "description": "Last boot member ID",
            "type": "string"
          },
          "lastStartMemberName": {
            "description": "Last boot member name",
            "type": "string"
          },
          "proxy": {
            "description": "Proxy settings",
            "$ref": "#/components/schemas/ProxyInfo"
          },
          "proxyStatus": {
            "type": "integer",
            "description": "Proxy Status:0-Not Detected 1-Detecting 2-Detecting Failed 3-Detecting Successful"
          },
          "supportAdb": {
            "description": "Whether ADB is supported: 0 = no, 1 = yes",
            "type": "boolean"
          },
          "tagInfos": {
            "description": "Tag details. Empty array when no tags are assigned",
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "description": "Tag ID",
                  "type": "string"
                },
                "tagName": {
                  "description": "Tag name",
                  "type": "string"
                }
              },
              "required": [
                "id",
                "tagName"
              ]
            }
          },
          "updateDate": {
            "description": "Update time",
            "type": "string",
            "pattern": "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$"
          },
          "updateMember": {
            "description": "Updater member ID",
            "type": "integer"
          }
        }
      },
      "AdbInfo": {
        "type": "object",
        "description": "ADB info is only available when the phone is powered on (envStatus >= 4); it cannot be queried when powered off or booting",
        "properties": {
          "adbIp": {
            "type": "string",
            "description": "adb ip"
          },
          "adbPassword": {
            "type": "string",
            "description": "adb connection password"
          },
          "adbPort": {
            "type": "string",
            "description": "adb port"
          },
          "command": {
            "type": [
              "string",
              "null"
            ],
            "description": "ADB SSH tunnel connection command"
          },
          "expireTime": {
            "type": [
              "string",
              "null"
            ],
            "description": "ADB connection expiration time"
          },
          "remark": {
            "type": "string",
            "description": "Failure Remarks Information"
          },
          "success": {
            "type": "integer",
            "description": "Successful acquisition 1=Yes 0=No"
          }
        },
        "required": [
          "adbIp",
          "adbPassword",
          "adbPort",
          "remark",
          "success"
        ]
      },
      "ProxyInfo": {
        "type": "object",
        "properties": {
          "country": {
            "description": "Country",
            "type": "string"
          },
          "countryCode": {
            "description": "Country code",
            "type": "string"
          },
          "createDate": {
            "description": "Creation time",
            "type": "string",
            "pattern": "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$"
          },
          "delFlag": {
            "type": "integer",
            "description": "1 - deleted 2 - not deleted"
          },
          "expiryTime": {
            "description": "Expiration time",
            "type": "string"
          },
          "exportIp": {
            "description": "Outgoing IP address",
            "type": "string"
          },
          "groupId": {
            "description": "Group ID",
            "type": "string"
          },
          "id": {
            "description": "ID",
            "type": "string"
          },
          "providerCode": {
            "description": "Device type code",
            "type": "string"
          },
          "proxyAreaCode": {
            "description": "Proxy location area code",
            "type": "string"
          },
          "proxyCatagoryType": {
            "type": "integer",
            "description": "Proxy type:0:site group 1:cloud platform 2:own IP 3:vps 4:virtual machine"
          },
          "proxyCheckStatus": {
            "type": "integer",
            "description": "Detection status:0:pending detection 1:successful detection 2:detection failure 3:unknown error"
          },
          "proxyInfo": {
            "description": "Proxy details string",
            "type": "string"
          },
          "state": {
            "type": [
              "string",
              "null"
            ],
            "description": "Proxy state or province. Uses detected exit-IP location when available, otherwise the configured location; may be null or empty.",
            "example": "California"
          },
          "city": {
            "type": [
              "string",
              "null"
            ],
            "description": "Proxy city. Uses detected exit-IP location when available, otherwise the configured location; may be null or empty.",
            "example": "Los Angeles"
          },
          "proxyIp": {
            "description": "Proxy server IP address",
            "type": "string"
          },
          "proxyName": {
            "description": "Proxy configuration name",
            "type": "string"
          },
          "proxyPort": {
            "type": [
              "integer",
              "null"
            ],
            "format": "int32",
            "description": "Proxy connection port, not a port inferred from the proxy name. May be null when unavailable.",
            "example": 1080
          },
          "proxyRegionCode": {
            "description": "Proxy location region code",
            "type": "string"
          },
          "proxyStatus": {
            "type": "integer",
            "description": "0-Normal 1-Pending allocation 2-Upgrading 3-Expired"
          },
          "proxySub": {
            "description": "Proxy subscription information",
            "$ref": "#/components/schemas/ProxySubscription"
          },
          "proxyType": {
            "type": "integer",
            "description": "Proxy type：0-http 1-https 2-socks5 4-Oxylabs 5-Proxys.io 6-GeoSurf 9-Oxylabsauto 10-Trogan 11-Shadowsocks 12-vmess"
          },
          "proxyTypeCode": {
            "description": "Proxy protocol type code",
            "type": "string"
          },
          "regionKey": {
            "description": "Cloud platform region key",
            "type": "string"
          },
          "releaseTime": {
            "type": "string",
            "pattern": "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$",
            "description": "Release time:deletion time if deleted, expiration time if expired"
          },
          "uniqueId": {
            "description": "Display sort sequence ID",
            "type": "integer"
          }
        },
        "required": [
          "country",
          "countryCode",
          "createDate",
          "delFlag",
          "expiryTime",
          "exportIp",
          "groupId",
          "id",
          "providerCode",
          "proxyAreaCode",
          "proxyCatagoryType",
          "proxyCheckStatus",
          "proxyInfo",
          "proxyIp",
          "proxyName",
          "proxyPort",
          "proxyRegionCode",
          "proxyStatus",
          "proxySub",
          "proxyType",
          "proxyTypeCode",
          "regionKey",
          "releaseTime",
          "uniqueId"
        ]
      },
      "ProxySubscription": {
        "type": "object",
        "properties": {
          "activeRecordId": {
            "description": "Active subscription record ID",
            "type": "string"
          },
          "businessId": {
            "description": "Proxy service business ID",
            "type": "string"
          },
          "createMember": {
            "description": "Creator member ID",
            "type": "integer"
          },
          "endTime": {
            "description": "End time",
            "type": "string"
          },
          "id": {
            "description": "Subscription ID",
            "type": "string"
          },
          "nextBillingTime": {
            "description": "Next billing/payment time",
            "type": "string"
          },
          "startTime": {
            "description": "Start time of validity",
            "type": "string"
          },
          "subPayMethod": {
            "description": "Subscription payment method",
            "type": "string"
          },
          "subStatus": {
            "type": "integer",
            "description": "Subscription Status:0-Pending 1-Subscribed 2-Cancelled"
          },
          "subType": {
            "type": "integer",
            "description": "Subscription Type:1-Agent 2-Package"
          },
          "teamId": {
            "description": "Team ID",
            "type": "string"
          }
        },
        "required": [
          "activeRecordId",
          "businessId",
          "createMember",
          "endTime",
          "id",
          "nextBillingTime",
          "startTime",
          "subPayMethod",
          "subStatus",
          "subType",
          "teamId"
        ]
      },
      "CloudPhoneDetail": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "cloud phone id"
          },
          "androidId": {
            "type": "string",
            "description": "cloud phone android id"
          },
          "gaid": {
            "type": "string",
            "description": "cloud phone gaid"
          },
          "envName": {
            "type": "string",
            "description": "cloud phone name"
          },
          "groupId": {
            "description": "Group ID",
            "type": "string"
          },
          "groupName": {
            "description": "Group name. Null when the cloud phone is ungrouped",
            "type": [
              "string",
              "null"
            ]
          },
          "skuId": {
            "description": "Product SKU ID",
            "type": "string"
          },
          "tagInfos": {
            "description": "Tag details. Empty array when no tags are assigned",
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "description": "Tag ID",
                  "type": "string"
                },
                "tagName": {
                  "description": "Tag name",
                  "type": "string"
                }
              },
              "required": [
                "id",
                "tagName"
              ]
            }
          },
          "billingType": {
            "description": "Billing type: 1 = Pay-per-minute (On-demand), 2 = Monthly",
            "type": "integer"
          },
          "proxyStatus": {
            "description": "Proxy status: 0 = not detected, 1 = detecting, 2 = detection failed, 3 = detection successful",
            "type": "integer"
          },
          "settings": {
            "description": "Advanced fingerprint settings",
            "type": "object",
            "properties": {
              "automaticGeo": {
                "type": "boolean"
              },
              "automaticLocation": {
                "type": "boolean"
              },
              "automaticLanguage": {
                "type": "boolean"
              },
              "longitude": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "latitude": {
                "type": [
                  "number",
                  "null"
                ]
              }
            },
            "required": [
              "automaticGeo",
              "automaticLocation",
              "automaticLanguage",
              "longitude",
              "latitude"
            ]
          },
          "device": {
            "description": "Device hardware information",
            "type": "object",
            "properties": {
              "server": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "countryName": {
                "type": "string"
              },
              "rom": {
                "type": "integer"
              },
              "wifiBssid": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "bluetoothMac": {
                "type": "string"
              }
            },
            "required": [
              "server",
              "countryName",
              "rom",
              "wifiBssid",
              "bluetoothMac"
            ]
          },
          "proxy": {
            "description": "Proxy settings",
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "proxyName": {
                "type": "string"
              },
              "state": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Proxy state or province. Uses detected exit-IP location when available, otherwise the configured location; may be null or empty.",
                "example": "California"
              },
              "city": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Proxy city. Uses detected exit-IP location when available, otherwise the configured location; may be null or empty.",
                "example": "Los Angeles"
              },
              "proxyPort": {
                "type": [
                  "integer",
                  "null"
                ],
                "format": "int32",
                "description": "Proxy connection port, not a port inferred from the proxy name. May be null when unavailable.",
                "example": 1080
              },
              "proxyIp": {
                "type": "string"
              }
            },
            "required": [
              "id",
              "proxyName",
              "proxyIp"
            ]
          },
          "lastStartMemberId": {
            "description": "Last boot member ID",
            "type": "string"
          },
          "lastStartMemberName": {
            "description": "Last boot member name",
            "type": [
              "string",
              "null"
            ]
          },
          "lastStartDate": {
            "description": "Last boot time",
            "type": "string",
            "pattern": "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$"
          },
          "lastConnectMemberId": {
            "description": "Last connected member ID",
            "type": "string"
          },
          "lastConnectMemberName": {
            "description": "Last connected member name",
            "type": [
              "string",
              "null"
            ]
          },
          "lastConnectDate": {
            "description": "Last connection time",
            "type": "string",
            "pattern": "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$"
          },
          "envStatus": {
            "description": "Environment status: 0 = new, 1 = creation failed, 2 = powered off, 3 = booting, 4 = powered on, 5 = resetting, 6 = restarting, 7 = one-click new machine in progress",
            "type": "integer"
          },
          "abnormalStatus": {
            "description": "Abnormal status: 0 = normal, 1 = unactivated, 2 = arrears, 3 = oversold, 4 = deactivated",
            "type": "integer"
          },
          "expireTime": {
            "description": "Expiration time",
            "type": "string"
          },
          "envRemark": {
            "description": "Environment remark",
            "type": "string"
          },
          "createMember": {
            "description": "Creator member ID",
            "type": "string"
          },
          "updateMember": {
            "description": "Updater member ID",
            "type": "string"
          },
          "updateDate": {
            "description": "Update time",
            "type": "string",
            "pattern": "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$"
          },
          "createDate": {
            "description": "Creation time",
            "type": "string",
            "pattern": "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$"
          },
          "createMemberName": {
            "description": "Creator member name",
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "id",
          "envName",
          "groupId",
          "skuId",
          "tagInfos",
          "billingType",
          "proxyStatus",
          "settings",
          "device",
          "proxy",
          "lastStartMemberId",
          "lastStartMemberName",
          "lastStartDate",
          "lastConnectMemberId",
          "lastConnectMemberName",
          "lastConnectDate",
          "envStatus",
          "abnormalStatus",
          "expireTime",
          "envRemark",
          "createMember",
          "updateMember",
          "updateDate",
          "createDate",
          "createMemberName"
        ]
      },
      "ExecutionDTO": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Execution record id"
          },
          "taskName": {
            "type": "string",
            "description": "Schedule Task name"
          },
          "taskState": {
            "type": "integer",
            "description": "Schedule status; 0:awaiting execution; 1:Executing; 2:Execution completed 3:Cancel"
          },
          "cloudPhoneId": {
            "type": "string",
            "description": "Cloud phone ID"
          },
          "cloudPhoneName": {
            "type": "string",
            "description": "Cloud phone name"
          },
          "templateName": {
            "type": "string",
            "description": "Template title"
          },
          "handleFailCode": {
            "type": "string",
            "description": "Task failure code"
          },
          "handleFailReason": {
            "type": "string",
            "description": "Task failure reason"
          },
          "handleResult": {
            "type": "integer",
            "description": "Task result. 0:failed; 1:succeeded"
          },
          "handleResultAttachment": {
            "type": "string",
            "description": "Task execution result attachment"
          },
          "handleTime": {
            "type": "string",
            "description": "Execution time"
          },
          "endTime": {
            "type": "string",
            "description": "Task end time"
          },
          "powerOnTime": {
            "type": "string",
            "description": "Cloud phone power-on time"
          },
          "triggerNextTime": {
            "type": "string",
            "description": "Next scheduled trigger time"
          },
          "triggerTime": {
            "type": "string",
            "description": "Scheduled trigger time"
          },
          "createDate": {
            "type": "string",
            "description": " Creation time"
          },
          "createMember": {
            "type": "string",
            "description": "Creator"
          },
          "updateDate": {
            "type": "string",
            "description": "Last update time"
          },
          "updateMember": {
            "type": "string",
            "description": "Last updater"
          }
        }
      },
      "ApiBatchAdbInfoDto": {
        "type": "object",
        "required": [
          "envIds"
        ],
        "properties": {
          "envIds": {
            "type": "array",
            "description": "List of environment IDs, maximum 200",
            "maxItems": 200,
            "minItems": 1,
            "items": {
              "type": "string"
            },
            "example": [
              "1674380838117474",
              "1675787900043353"
            ]
          }
        }
      },
      "ApiBatchAdbInfoResultDto": {
        "type": "object",
        "description": "Batch ADB info query result",
        "properties": {
          "id": {
            "type": "string",
            "description": "Environment ID"
          },
          "supportAdb": {
            "type": "boolean",
            "description": "Whether ADB is supported"
          },
          "enableAdb": {
            "type": "boolean",
            "description": "Enable ADB 0 = Disabled, 1 = Enabled"
          },
          "envStatus": {
            "type": "integer",
            "description": "Environment status:\n- 0: New\n- 1: Creation failed\n- 2: Powered off\n- 3: Booting\n- 4: Powered on\n- 5: Resetting\n- 6: Restarting\n- 7: One-click new machine in progress\n"
          },
          "adbIp": {
            "type": [
              "string",
              "null"
            ],
            "description": "ADB connection IP address"
          },
          "adbPassword": {
            "type": [
              "string",
              "null"
            ],
            "description": "ADB connection password"
          },
          "adbPort": {
            "type": [
              "string",
              "null"
            ],
            "description": "ADB connection port"
          },
          "command": {
            "type": [
              "string",
              "null"
            ],
            "description": "ADB SSH tunnel connection command"
          },
          "expireTime": {
            "type": [
              "string",
              "null"
            ],
            "description": "ADB connection expiration time"
          },
          "remark": {
            "type": [
              "string",
              "null"
            ],
            "description": "Remark info. When ADB info cannot be retrieved, the reason is provided:\n- Environment does not exist\n- Environment is not powered on, unable to query ADB info\n- This environment does not support ADB\n- Failed to retrieve ADB info\n"
          }
        }
      },
      "ResponseDataListApiBatchAdbInfoResultDto": {
        "type": "object",
        "properties": {
          "code": {
            "type": "integer",
            "description": "Response code, 0 indicates success",
            "example": 0
          },
          "msg": {
            "type": [
              "string",
              "null"
            ],
            "description": "Response message",
            "example": "success"
          },
          "data": {
            "type": "array",
            "description": "ADB info list, in the same order as the requested envIds",
            "items": {
              "$ref": "#/components/schemas/ApiBatchAdbInfoResultDto"
            }
          }
        }
      },
      "TouchClickRequest": {
        "type": "object",
        "required": [
          "id",
          "pos"
        ],
        "properties": {
          "id": {
            "type": "string",
            "description": "Cloud Phone ID",
            "example": "1558968155668507"
          },
          "pos": {
            "type": "array",
            "items": {
              "type": "integer"
            },
            "minItems": 2,
            "maxItems": 2,
            "description": "Tap coordinates [x, y]. The coordinate system uses the top-left corner as origin (0, 0).",
            "example": [
              540,
              960
            ]
          },
          "duration": {
            "type": "integer",
            "description": "Press duration in milliseconds (used for long press). If omitted, the default duration is used.",
            "example": 2000
          }
        }
      },
      "TouchSwipeRequest": {
        "type": "object",
        "required": [
          "id",
          "pos1",
          "pos2"
        ],
        "properties": {
          "id": {
            "type": "string",
            "description": "Cloud Phone ID",
            "example": "1558968155668507"
          },
          "pos1": {
            "type": "array",
            "items": {
              "type": "integer"
            },
            "minItems": 2,
            "maxItems": 2,
            "description": "Start coordinates [x, y]",
            "example": [
              540,
              1500
            ]
          },
          "pos2": {
            "type": "array",
            "items": {
              "type": "integer"
            },
            "minItems": 2,
            "maxItems": 2,
            "description": "End coordinates [x, y]",
            "example": [
              540,
              500
            ]
          },
          "duration": {
            "type": "integer",
            "description": "Swipe/drag duration in milliseconds. A larger value results in a slower action.",
            "example": 300
          }
        }
      },
      "TouchResultResponse": {
        "type": "object",
        "properties": {
          "code": {
            "type": "integer",
            "description": "Status code, 0 means success",
            "example": 0
          },
          "msg": {
            "type": [
              "string",
              "null"
            ],
            "description": "Response message",
            "example": "success"
          },
          "data": {
            "type": "object",
            "properties": {
              "status": {
                "type": "string",
                "description": "Execution status",
                "example": "finish"
              }
            }
          }
        }
      },
      "ResponseEnvelopeBase": {
        "type": "object",
        "required": [
          "code",
          "msg",
          "requestId"
        ],
        "properties": {
          "code": {
            "type": "integer",
            "description": "Business result code; `0` indicates success",
            "example": 0
          },
          "msg": {
            "type": [
              "string",
              "null"
            ],
            "description": "Error message; null when successful",
            "example": null
          },
          "requestId": {
            "type": "string",
            "description": "Request ID for troubleshooting",
            "example": "1d4f3ea968664593860b94b35d4ebf5e"
          }
        }
      },
      "MonthlyCloudPhoneSkuPrice": {
        "type": "object",
        "required": [
          "price",
          "period",
          "periodUnit"
        ],
        "properties": {
          "price": {
            "type": "integer",
            "minimum": 0,
            "description": "Configured price in US cents"
          },
          "period": {
            "type": "integer",
            "description": "Billing-period count returned by the product service"
          },
          "periodUnit": {
            "type": "string",
            "description": "Localized billing-period unit returned by the product service"
          },
          "priceDesc": {
            "type": [
              "string",
              "null"
            ],
            "description": "Localized display price, when configured"
          }
        }
      },
      "MonthlyCloudPhoneSku": {
        "type": "object",
        "required": [
          "skuId",
          "skuName",
          "prices"
        ],
        "properties": {
          "skuId": {
            "type": "string",
            "description": "Monthly Cloud Phone product ID"
          },
          "skuName": {
            "type": "string",
            "description": "Product name returned in the product-service language"
          },
          "cloudPhoneAndroidVersion": {
            "type": [
              "string",
              "null"
            ],
            "description": "Android version, or null when the product has no configured value"
          },
          "cloudPhoneStorage": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Storage capacity in GB, or null when the product has no configured value"
          },
          "prices": {
            "type": "array",
            "minItems": 1,
            "description": "Active monthly price configurations",
            "items": {
              "$ref": "#/components/schemas/MonthlyCloudPhoneSkuPrice"
            }
          }
        }
      },
      "MonthlyCloudPhoneActivateRequest": {
        "type": "object",
        "required": [
          "ids"
        ],
        "properties": {
          "ids": {
            "type": "array",
            "minItems": 1,
            "maxItems": 10,
            "uniqueItems": true,
            "description": "One to ten distinct positive Cloud Phone IDs, encoded as strings to preserve 64-bit precision",
            "items": {
              "type": "string",
              "pattern": "^[1-9][0-9]*$"
            }
          }
        }
      },
      "MonthlyCloudPhoneActivationResult": {
        "type": "object",
        "required": [
          "id",
          "status"
        ],
        "properties": {
          "id": {
            "type": "string",
            "description": "Cloud Phone ID"
          },
          "status": {
            "type": "string",
            "enum": [
              "ACTIVATED",
              "FAILED",
              "UNKNOWN"
            ],
            "description": "Activation result"
          },
          "expireTime": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^[0-9]+$",
            "description": "Unix time in milliseconds; present for a successful activation"
          },
          "errorCode": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Business error code for a failed item"
          }
        }
      },
      "MonthlyCloudPhoneActivationData": {
        "type": "object",
        "required": [
          "orderId",
          "orderStatus",
          "results"
        ],
        "properties": {
          "orderId": {
            "type": "string",
            "description": "Paid balance-order ID"
          },
          "orderStatus": {
            "type": "integer",
            "enum": [
              1
            ],
            "description": "Order status; 1 means completed"
          },
          "results": {
            "type": "array",
            "description": "One result per requested ID, in request order",
            "items": {
              "$ref": "#/components/schemas/MonthlyCloudPhoneActivationResult"
            }
          }
        }
      },
      "CloudPhoneLiveStartRequest": {
        "type": "object",
        "required": [
          "phoneId",
          "fileId"
        ],
        "properties": {
          "phoneId": {
            "type": "string",
            "description": "Cloud phone ID",
            "example": "190000000000000001"
          },
          "fileId": {
            "type": "string",
            "description": "ID of an uploaded MP4 live-streaming file (`uploadType=2`)",
            "example": "820000000000000001"
          }
        }
      },
      "CloudPhoneLivePhoneRequest": {
        "type": "object",
        "required": [
          "phoneId"
        ],
        "properties": {
          "phoneId": {
            "type": "string",
            "description": "Cloud phone ID",
            "example": "190000000000000001"
          }
        }
      }
    },
    "securitySchemes": {},
    "responses": {
      "BalanceResponse": {
        "description": "Request processed; inspect `code` for the business result",
        "content": {
          "application/json": {
            "schema": {
              "allOf": [
                {
                  "$ref": "#/components/schemas/ResponseEnvelopeBase"
                },
                {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "type": "object",
                      "required": [
                        "balance",
                        "remainingDuration",
                        "remainingConcurrency"
                      ],
                      "properties": {
                        "balance": {
                          "type": "integer",
                          "format": "int32",
                          "description": "Available wallet balance in cents"
                        },
                        "remainingDuration": {
                          "type": "string",
                          "pattern": "^[0-9]+$",
                          "description": "Remaining cloud phone duration in minutes, serialized as a numeric string"
                        },
                        "remainingConcurrency": {
                          "type": "integer",
                          "minimum": 0,
                          "description": "Remaining team-level cloud phone concurrency"
                        }
                      }
                    }
                  }
                }
              ]
            },
            "example": {
              "code": 0,
              "msg": null,
              "data": {
                "balance": 12500,
                "remainingDuration": "120",
                "remainingConcurrency": 3
              },
              "requestId": "1d4f3ea968664593860b94b35d4ebf5e"
            }
          }
        }
      },
      "MonthlyCloudPhoneSkusResponse": {
        "description": "Request processed; `data` is an empty array when no monthly product is available",
        "content": {
          "application/json": {
            "schema": {
              "allOf": [
                {
                  "$ref": "#/components/schemas/ResponseEnvelopeBase"
                },
                {
                  "type": "object",
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/MonthlyCloudPhoneSku"
                      }
                    }
                  }
                }
              ]
            },
            "example": {
              "code": 0,
              "msg": null,
              "data": [
                {
                  "skuId": "10015",
                  "skuName": "Android 14",
                  "cloudPhoneAndroidVersion": "Android 14",
                  "cloudPhoneStorage": 64,
                  "prices": [
                    {
                      "price": 2500,
                      "period": 30,
                      "periodUnit": "days",
                      "priceDesc": "$25/30 days"
                    }
                  ]
                }
              ],
              "requestId": "36d574df5b9e41b5b3c796133ff5a079"
            }
          }
        }
      },
      "MonthlyCloudPhoneActivateResponse": {
        "description": "Request processed; inspect `code`, and inspect `data.results` when returned",
        "content": {
          "application/json": {
            "schema": {
              "allOf": [
                {
                  "$ref": "#/components/schemas/ResponseEnvelopeBase"
                },
                {
                  "type": "object",
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/MonthlyCloudPhoneActivationData"
                    }
                  }
                }
              ]
            },
            "example": {
              "code": 0,
              "msg": null,
              "data": {
                "orderId": "1724032801202461",
                "orderStatus": 1,
                "results": [
                  {
                    "id": "1724032706822188",
                    "status": "ACTIVATED",
                    "expireTime": "1791103955843",
                    "errorCode": null
                  }
                ]
              },
              "requestId": "db5e04c2eb804cdfb96b1469c7379bbc"
            }
          }
        }
      },
      "CloudPhoneLiveBooleanResponse": {
        "description": "Request processed; inspect `code` for the business result",
        "content": {
          "application/json": {
            "schema": {
              "allOf": [
                {
                  "$ref": "#/components/schemas/ResponseEnvelopeBase"
                },
                {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "type": "boolean",
                      "description": "Whether the live-streaming operation succeeded"
                    }
                  }
                }
              ]
            },
            "example": {
              "code": 0,
              "msg": null,
              "data": true,
              "requestId": "1d4f3ea968664593860b94b35d4ebf5e"
            }
          }
        }
      },
      "CloudPhoneLiveStatusResponse": {
        "description": "Request processed; inspect `code` for the business result",
        "content": {
          "application/json": {
            "schema": {
              "allOf": [
                {
                  "$ref": "#/components/schemas/ResponseEnvelopeBase"
                },
                {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "type": "object",
                      "properties": {
                        "liveStatus": {
                          "type": "integer",
                          "enum": [
                            0,
                            1
                          ],
                          "description": "Live status (`0` = stopped, `1` = running)"
                        },
                        "writeFileId": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Current file ID, when available"
                        },
                        "liveFilePath": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Current file path or URL, when available"
                        }
                      }
                    }
                  }
                }
              ]
            },
            "example": {
              "code": 0,
              "msg": null,
              "data": {
                "liveStatus": 1,
                "writeFileId": "820000000000000001",
                "liveFilePath": null
              },
              "requestId": "1d4f3ea968664593860b94b35d4ebf5e"
            }
          }
        }
      }
    }
  },
  "servers": [
    {
      "url": "http://127.0.0.1:40000",
      "description": "MoreLogin  Local endpoint"
    }
  ],
  "security": []
}